4

这是一个后续问题: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 中的元组,然后使用它的内容生成一个 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...)

错误:

一个例子:SayCar有 3 个实例:

  1. 宝马
  2. 法拉利
  3. 兰博基尼

现在,当我从管理员添加一个 Person 实例时,例如:

per成为一个实例,car = BMW, FERRARIname = Bob 我点击save管理员时,set_trace()启动。所以在查询之后generate_license

pdb,当查询执行时,我尝试打印出来,per.car.all()但它给了我[],当我尝试打印出来时per.name,它确实打印出来Bob。所以我并没有真正了解如何per.name保存和不保存per.car

此外,当请求完成时,即我按下cpdb我再次单击相同实例的保存,这次它读取per.car.all()完美,而如果在保存之前,我添加了LAMBORGHINI,它只显示BMWFERRARI。所以我猜正在发生的是该many-to-many领域的请求迟到了。虽然我无法指出这其中的原因。需要一些帮助。我错过了什么吗?

问题:有没有特定的方法来识别update signala 中的 a create signal?我的意思是我不想在License每次更新数据时都生成一个新的。License只有在创建数据时才会生成新的。那么,如何区分updatesave信号呢?

4

1 回答 1

2

post_save不适用于 m2m 字段。你必须使用m2m_changed信号

像这样的东西:

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)
于 2013-06-23T18:21:07.943 回答