python – 在使用信号检测django中的保存操作时,对象中未显示多对多字段
作者:互联网
这是一个跟进问题:Cant get post_save to work in Django
我的模特是:
class Car(models.Model):
name = models.CharField(max_length=50)
...
some other attributes of Car
...
class Person(models.Model):
car = models.ManyToManyField(Car)
name = models.CharField(max_lenght=100)
...
Some other attributes of Person
...
class License(models.Model):
person = models.ForeignKey(Person)
...
Other attributes of License
...
信号处理器:
def signal_handler(sender, **kwargs):
print 'Person saved!'
generate_license()
post_save.connect(signal_handler, sender=Person, dispatch_uid="Unique person")
意图:当创建Person的实例时,我想生成一个License对象.因此,我筛选出添加到License中的最后一个元组,然后使用其内容生成许可证实例.
def generate_license():
import pdb
pdb.set_trace()
man = Person.objects.filter().order_by('-time_added')[:1][0] # Restricting the filter to one query and then taking the value at the 0th index. order_by '-time_added' gives the latest tuple at the top.
license = License.objects.create(...Info about car, person...)
错误:
一个例子:
说汽车有3个实例:
>宝马
>法拉利
> LAMBORGHINI
现在,当我从管理员添加Person实例时,示例:
每个是car = BMW,FERRARI和name = Bob的例子
当我在admin中单击“保存”时,set_trace()将启动.所以在generate_license中查询之后:
在pdb中,当查询执行时,我尝试打印出per.car.all(),但它给了我[],当我尝试打印出per.name时,它会打印掉Bob.所以我并没有真正了解如何保存per.name和per.car不是.
此外,当请求完成时,即我在pdb中按了c,我再次点击同一实例的save,这次它完全读取per.car.all(),而如果在保存之前,我添加了LAMBORGHINI,它只显示宝马和法拉利.所以我猜想正在发生的事情是,多对多领域的请求迟到了.虽然我不能指出这个的原因.需要一些帮助.我错过了什么吗?
问题:是否有特定方法从创建信号中识别更新信号?我的意思是每次更新数据时我都不想生成新的许可证.只有在创建数据时才会生成新许可证.那么,如何区分更新和保存信号?
解决方法:
post_save不适用于m2m字段.你必须使用m2m_changed
signal.
像这样的东西:
def my_m2m_signal(sender, **kwargs):
action = kwargs.get('action')
if action == 'post_add':
print 'post_add is activated on m2m'
signals.m2m_changed.connect(my_m2m_signal, sender=Person.car.through)
标签:python,django,many-to-many,django-signals 来源: https://codeday.me/bug/20190703/1369272.html