tuf*_*der 3 django many-to-many save m2m
这让我很困惑......当我保存我的模型时,书对象没有改变。但是,如果我打开发票并再次保存,则会进行更改。我究竟做错了什么?
class Invoice(models.Model):
...
books = models.ManyToManyField(Book,blank=True,null=True)
...
def save(self, *args, **kwargs):
super(Invoice, self).save(*args, **kwargs)
for book in self.books.all():
book.quantity -= 1
if book.quantity == 0:
book.sold = True;
book.save()
Run Code Online (Sandbox Code Playgroud)
编辑:我试过使用 post_save 信号,但它的工作方式相同。第一次保存时没有更改,第二次保存更改。
更新:似乎可以通过以下代码解决:
class InvoiceAdmin(admin.ModelAdmin):
...
def save_model(self, request, obj, form, change):
obj.save()
for bk in form.cleaned_data['books']:
book = Book.objects.get(pk=bk.id)
book.quantity -= 1
if book.quantity == 0:
book.sold = True;
book.save()
Run Code Online (Sandbox Code Playgroud)
这就是我如何解决这个确实令人困惑的行为。将信号接收器连接到 models.signals.m2m_changed 事件,每次 m2m 字段更改时都会触发此获取。内联注释解释了原因。
class Gig(models.Model):
def slugify(self):
# Add venue name, date and artists to slug
self.slug = slugify(self.venue.name) + "-"
self.slug += self.date.strftime("%d-%m-%Y") + "-"
self.slug += "-".join([slugify(artist.name) for artist in self.artists.all()])
self.save()
@receiver(models.signals.m2m_changed, sender=Gig.artist.through)
def gig_artists_changed(sender, instance, **kwargs):
# This callback function get's called twice.
# 1 first change appears to be adding an empty list
# 2nd change is adding the actual artists
if instance.artist.all() and not instance.slug:
instance.slugify()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3136 次 |
| 最近记录: |