python – 在使用信号检测django中的保存操作时,对象中未显示多对多字段
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 在使用信号检测django中的保存操作时,对象中未显示多对多字段,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2046字,纯文字阅读大概需要3分钟。
内容图文
![python – 在使用信号检测django中的保存操作时,对象中未显示多对多字段](/upload/InfoBanner/zyjiaocheng/778/30c6d5d358764ac99c2ca4ab63f18c06.jpg)
这是一个跟进问题: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中的保存操作时,对象中未显示多对多字段全部内容,希望文章能够帮你解决python – 在使用信号检测django中的保存操作时,对象中未显示多对多字段所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。