代码之家  ›  专栏  ›  技术社区  ›  Etienne

如何对m2m关系建模,其中相关表可以是城市、地区(州)或国家

  •  0
  • Etienne  · 技术社区  · 14 年前

    class Artist(models.Model):
        name = models.CharField(max_length=128)
        born_place = models.ForeignKey(???)
        dead_place = models.ForeignKey(???)
        live_places = models.ManyToManyField(???)
        work_places = models.ManyToManyField(???)
    
    class Country(models.Model):
        iso = models.CharField(max_length=2, primary_key=True)
        name = models.CharField(max_length=50)
    
    class Region(models.Model):
        iso = models.CharField(max_length=2, blank=True)
        name = models.CharField(max_length=150)
        country = models.ForeignKey('Country')
    
    class City(models.Model):
        name = models.CharField(max_length=150)
        region = models.ForeignKey('Region')
    

    所有的 地点 ( born_place dead_place , live_places work_places )可以是一个 City 或者 Region Country . 和一个 城市 必须有一个 ,和 必须有一个 国家 .

    4 回复  |  直到 14 年前
        1
  •  1
  •   o.elias    14 年前

    class Territory(models.Model):
        name = models.CharField(max_length=150)
    
    class Country(Territory):
        iso = models.CharField(max_length=2, primary_key=True)
    
    class Region(Territory):
        iso = models.CharField(max_length=2, blank=True)
        country = models.ForeignKey('Country')
    
    class City(Territory):
        region = models.ForeignKey('Region')
    
    class Artist(models.Model):
        name = models.CharField(max_length=128)
        born_place = models.ForeignKey(Territory)
        dead_place = models.ForeignKey(Territory)
        live_places = models.ManyToManyField(Territory)
        work_places = models.ManyToManyField(Territory)
    

    致以最诚挚的问候!

        2
  •  1
  •   Community CDub    4 年前

    在这种情况下你需要的是 generic foreign key . 在Django,这可以通过方便的 contenttypes 框架。

    根据文件:

    1. 给你的模型一个ForeignKey到ContentType。

    2. 为您的模型提供一个GenericForeignKey,并将上述两个字段的名称传递给它。如果这些字段名为“content\u type”和“object\u id”,您可以忽略这一点——这些是GenericForeignKey将查找的默认字段名。

        3
  •  1
  •   pleasedontbelong    14 年前

    我想说,您可以创建一个Territory模型,而不是Country、Region和City;然后使用 recursive relationship

    class Territory(models.Model):
       iso = models.CharField(max_length=2, blank=True)
       name = models.CharField(max_length=150)
       parent = models.ForeignKey('self')
    

    这将为您的领土创建一个层次结构,因此现在您可以使用任意多的分区(例如,大陆、行星、社区),并且您不必更改您的模型。至于艺术家,你可以这样做:

    class Artist(models.Model):
        name = models.CharField(max_length=128)
        born_place = models.ForeignKey(Territory)
        dead_place = models.ForeignKey(Territory)
        live_places = models.ManyToManyField(Territory)
        work_places = models.ManyToManyField(Territory)
    

    所以现在。。。出生地可以是一个城市,一个地区,一个星球。。。你想要什么都行!我想那是你的问题。我不是django方面的专家,这只是在O.O.P中解决这类问题的一般方法。

        4
  •  0
  •   Steve Jalim    14 年前

    看看Django的泛型关系 here here ,这将允许您为各种类型的对象设置关键帧,而不是仅为特定的对象设置关键帧。