Django:保存后访问ManyToManyField对象

标签 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()

编辑:我尝试过使用 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()

最佳答案

这就是我解决这个确实令人困惑的行为的方法。将信号接收器连接到 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()

关于Django:保存后访问ManyToManyField对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2197747/

相关文章:

python - Openshift 从 Django 应用中查找静态文件

java - 如何将 HashMap 保存到 Android 中的文件?

iOS - 在 plist 文件中保存应用程序购买数据?

django - post_delete/pre_delete 信号未针对特定发件人触发

django - 如何根据 django 管理面板中的登录用户清理表单数据?

python - Django rest framework 一对一关系

java - @ManyToMany JPA 关系在连接表和 UK 中使用二度关系

python - 如何在模板中显示ManyToMany字段

Java Spring ManyToOne 如何加载唯一引用

c++ - C++中保存复杂对象的方法