这是一个后续问题: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 个实例:
- 宝马
- 法拉利
- 兰博基尼
现在,当我从管理员添加一个 Person 实例时,例如:
per
成为一个实例,car = BMW, FERRARI
当name = Bob
我点击save
管理员时,set_trace()
启动。所以在查询之后generate_license
:
在pdb
,当查询执行时,我尝试打印出来,per.car.all()
但它给了我[]
,当我尝试打印出来时per.name
,它确实打印出来Bob
。所以我并没有真正了解如何per.name
保存和不保存per.car
。
此外,当请求完成时,即我按下c
,pdb
我再次单击相同实例的保存,这次它读取per.car.all()
完美,而如果在保存之前,我添加了LAMBORGHINI
,它只显示BMW
和FERRARI
。所以我猜正在发生的是该many-to-many
领域的请求迟到了。虽然我无法指出这其中的原因。需要一些帮助。我错过了什么吗?
问题:有没有特定的方法来识别update signal
a 中的 a create signal
?我的意思是我不想在License
每次更新数据时都生成一个新的。License
只有在创建数据时才会生成新的。那么,如何区分update
和save
信号呢?