我有一个带有字段的模型
countries = models.ManyToManyField(Country, blank=True)
我想要一个新字段
count = models.IntegerField()
是添加或删除国家/地区时也会更新的国家/地区的计数。我知道有一个.count()
方法,但是我不确定如何将我的计数字段设置为等于该值。
答案 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)