给定在Django Admin应用程序中使用的(简化)模型:
models.py个
class Appointment(models.Model):
customer = models.ForeignKey(
Customer, blank=False, null=True, on_delete=models.CASCADE
)
pianos = models.ManyToManyField(Piano, blank=True)
def save(self, *args, **kwargs):
# Is it a new Appointment, not an existing one being re-saved?
newAppointment = self.id is None
try:
super().save(*args, **kwargs) # Call the "real" save() method.
if newAppointment:
# Returns empty queryset
for piano in self.pianos.all():
print(piano)
except:
pass
我想访问‘钢琴’.如果是新创建的约会,
self.pianos
份退货
<;django.db.models.fields.related_descriptors.create_forward_many_to_many_manager..ManyRelatedManager 位于0x7f6f875209a0>的对象;
而self.pianos.all()
则返回空的查询集,即使钢琴显示在提交以启动保存的模板表单中.
However,如果是对现有的Appointment
进行更新,则‘pianos’会按预期返回数据.
显然,调用save()
时,ManyToMany
字段不会立即保存到数据库中.那么,我如何访问如下所示的数据呢?请注意,‘pianos’没有在这里实例化,它们已经存在于数据库中,并且只需要指定指向其M2M字段中的一个或多个,如admin.py
中定义的horizontal_filter
所指示的那样.
我也try 了另一种使用post_save
信号的方法,结果完全相同:
@receiver(signals.post_save, sender=Appointment)
def createServiceHistory(sender, instance, created, **kwargs):
if created:
for piano in instance.pianos.all(): #empty queryset
print(piano)
Update:修改为捕获m2m_changed
,而不是POST_SAVE:
@receiver(signals.m2m_changed, sender=Appointment)
def createServiceHistory(sender, instance, action, **kwargs):
print(action)
但是这个信号没有被接收到.
The docs表示使用add()
而不是save()
保存了ManyToMany
个字段,但我不明白在这种情况下如何应用这一点.