如何在Django中添加所有外键关系?

时间:2018-09-17 00:23:29

标签: python django python-3.x django-models

我有这两个模型:

class Country(models.Model):
    Name = models.CharField(max_length=100)
    Population = models.CharField(max_length=100)
    Language = models.IntegerField()
    Total_persons= models.IntegerField()

class Person(models.Model):
    Country = models.ForeignKey(Country, on_delete=models.CASCADE, null=True)
    name = models.CharField(max_length=100)
    contact = models.IntegerField()

Country中,我有美国,加拿大,墨西哥,西班牙,法国... 在Person中,我有1000多人。

在该国家,如何使Total_persons随着Persons总数的增加而增加。

3 个答案:

答案 0 :(得分:3)

您可以删除该字段,而不用将Total_persons设置为单独的字段,而只需使用以下命令即可获取属于Person实例Country的{​​{1}}的数量:

country

或者,如果您希望使用更友好的名称,则可以为country.person_set.count() 中的Country外键指定一个Person

related_name

以便您可以通过以下方式获得相同的计数:

class Person(models.Model):
    Country = models.ForeignKey(Country, related_name='persons', on_delete=models.CASCADE, null=True)

或者,如果您仍然希望将country.persons.count() 设置为单独的字段,则可以在创建Total_persons实例时(当其{{ 1}}是Person.save()),并覆盖Person方法以在删除pk实例时进行同步:

None

答案 1 :(得分:3)

您的模型字段名称应为小写。 有关更多信息,请参见Coding Style-Model。另外,您的人口和语言字段似乎没有正确的数据类型?

实现模型所需的另一种方法是使用模型属性。

13.2

答案 2 :(得分:2)

您可以通过多种方法来获取不带数据库字段的国家/地区的人数:

使用annotations

pt[xxx]

否则,如果您确实想要一个DB字段,则可以使用post / pre挂钩。 有:

  • Post save

    qs = Country.objects.annotate(total_people=models.Count('person_set'))
    for country in qs:
        print(country.total_people)
    
  • Post delete

    @receiver(post_save, sender=Person)
    def increment_total_people(sender, instance, created, **kwargs):
        instance.Country.Total_persons += 1
        instance.Country.save()
    

但是当这个数字可能改变时,您必须为所有用例设计事物。