django模型,处理多个外键

hmae6n7t  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(400)

我正忙于处理基于美国淡水湖的数据集。
所以我的模型基本上是州和湖。国家是湖上的外键。
当我开始加载数据时,我很快意识到一些湖泊似乎与多个州接壤。例如伊利湖进入4个州+一个国际边界。
然后我不得不重新考虑一下我的模型,并得出如下结论:,

class State(models.Model):
    name = models.CharField(max_length=200, null=True)

    def __str__(self):
        return str(self.name)

class Lake(models.Model):
    state = models.ForeignKey(State, on_delete=models.CASCADE, verbose_name="primary state", related_name="related_primary_state", help_text="Primary State")
    state_secondary = models.ForeignKey(State, on_delete=models.CASCADE, null=True, blank=True, related_name="related_secondary_state", verbose_name="secondary state", help_text="Secondary State")
    state_three = models.ForeignKey(State, on_delete=models.CASCADE, null=True, blank=True, related_name="related_three_state", verbose_name="three state", help_text="three State")
    state_four = models.ForeignKey(State, on_delete=models.CASCADE, null=True, blank=True, related_name="related_four_state", verbose_name="four state", help_text="four State")
    state_five = models.ForeignKey(State, on_delete=models.CASCADE, null=True, blank=True, related_name="related_five_state", verbose_name="five state", help_text="five State")
    name = models.CharField(max_length=200, null=True)

    def __str__(self):
        return str(self.name)

这样做可以吗,还是有更好的方法?
谢谢!

7vhp5slm

7vhp5slm1#

你最好使用这样的多对多关系:

class Lake(models.Model):
    states = models.ManyToManyField(State)
    name = models.CharField(max_length=200, null=True)

    def __str__(self):
        return str(self.name)

这样你就不必担心一个给定的湖有多少个州是被指定的。然后,您可以将任意多个州关联到给定的湖泊:

st1 = State(name="test1")
st1.save()
st2 = State(name="test2")
st2.save()
lk1 = Lake(name="lake1")
lk1.save()
lk1.states.add(st1, st2)

您可以按如下方式检索所有状态:

>>>> lk1.states.all()
<QuerySet [<State: test1>, <State: test2>]>

有关详细信息,请参阅文档:https://docs.djangoproject.com/en/3.0/topics/db/examples/many_to_many/

相关问题