编程语言
首页 > 编程语言> > python – 在使用信号检测django中的保存操作时,对象中未显示多对多字段

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