我有这两个模型:
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
总数的增加而增加。
答案 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)
答案 2 :(得分:2)
您可以通过多种方法来获取不带数据库字段的国家/地区的人数:
使用annotations:
pt[xxx]
否则,如果您确实想要一个DB字段,则可以使用post / pre挂钩。 有:
qs = Country.objects.annotate(total_people=models.Count('person_set'))
for country in qs:
print(country.total_people)
@receiver(post_save, sender=Person)
def increment_total_people(sender, instance, created, **kwargs):
instance.Country.Total_persons += 1
instance.Country.save()
但是当这个数字可能改变时,您必须为所有用例设计事物。