Django:整数字段,是ManyToMany字段的计数

时间:2018-11-06 18:17:21

标签: python django django-models

我有一个带有字段的模型

countries = models.ManyToManyField(Country, blank=True)

我想要一个新字段

count = models.IntegerField()

是添加或删除国家/地区时也会更新的国家/地区的计数。我知道有一个.count()方法,但是我不确定如何将我的计数字段设置为等于该值。

3 个答案:

答案 0 :(得分:1)

仅当用户本身被保存时,您的自我回答才会更新,而不仅仅是m2m关系本身被更新时。您需要的是the m2m-changed signal

我已将DT_NEEDED的{​​{1}}换出以避免在此处进行额外的工作,但是它已经过测试并且可以正常工作。

DT_RPATH

示例(在交互式AbstractUser中运行):

models.Model

但是,请注意,此不会捕获删除国家(地区)的实例(您可以为此使用连接到国家(地区)模型的from django.db import models from django.db.models.signals import m2m_changed class Country(models.Model): # ... pass class User(models.Model): countries = models.ManyToManyField(Country, related_name="users", blank=True) country_count = models.IntegerField(blank=True, default=0) # ... def countries_changed(sender, instance, action, **kwargs): # add, remove, and clear all have pre_ and post_ # events that trigger this signal; we only want to # run this -after- one of those events has completed, # to get the final count. if action.startswith("post_"): instance.country_count = instance.countries.count() instance.save() m2m_changed.connect(countries_changed, sender=User.countries.through) 信号)。

答案 1 :(得分:0)

您的models应该是这样的:

class Country(models.Model):
    count = models.IntegerField()

每次创建新的views.py对象时,在Country中,保存对象之前,您可以执行以下操作:

object.country.count += 1
object.save()

答案 2 :(得分:0)

我能够做到这一点:

class User(AbstractUser):
    countries = models.ManyToManyField(Country, blank=True)
    count = models.IntegerField(blank=True, default=0)

    def save(self, *args, **kwargs):
        self.count = self.countries.count()
        super(User, self).save(*args, **kwargs)