【问题标题】:How to override how many-to-many saves on 'through' field in Django?如何覆盖Django中“通过”字段的多对多保存?
【发布时间】:2019-10-24 15:58:38
【问题描述】:

总结

我想在Item 上自动增加一个order 字段,该字段用Set 中的m2m 字段定义(我知道这是个坏名字),这样我就可以轻松地更改它们的顺序。多对多字段是使用称为SetMetathrough 模型定义的,该模型仅包含itemset 和新字段order。我试过骑save(),但这从来没有被调用过。每次将item 添加到set 时,如何以编程方式将order 设置为默认值以外的其他值?

详情

每次将新的item 添加到set 时,我都想将它的order 设置为len(set.items.all())。为此,我在 SetMeta 上重新定义了 save(),但它从未被调用过。我必须重写什么以确保它按我想要的方式工作?

models.py

class Item(models.Model, AdminVideoMixin):
    title = models.TextField(max_length=5000)
    ....

class Set(Item):
    items = models.ManyToManyField(Item, related_name='in_sets', through='SetMeta', max_length=5000,)

    def get_absolute_url(self):
        return reverse('curate:set_detail',kwargs={'slug':self.slug})

    def get_queryset(self):
        return self.items.all().order_by('-itemOrder__order')

    def __str__(self):
        return self.title

    def auto_increment_order(self):
        print('IS THIS WORKING') <----never prints.
        length_of_set = len(self.set.items.all())
        return length_of_set

class SetMeta(models.Model):
    item = models.ForeignKey(Item, on_delete=models.CASCADE, related_name='itemOrder', max_length=5000)
    set = models.ForeignKey(Set, on_delete=models.CASCADE, related_name='SetOrder', max_length=5000)
    order = models.IntegerField(default=0, null=True,)

    def up(self):
        self.order += 1
        self.save()
        print(self.order)

    def down(self):
        self.order -= 1
        self.save()
        print(self.order)

    def save(self, *args, **kwargs):
        if self.order == 0:
            self.order = auto_increment_order(self)
        super(SetMeta, self).save(*args, **kwargs)
        print(f"{self.item.title} order is {self.order}") < ---- this never fires.

【问题讨论】:

    标签: python django model many-to-many


    【解决方案1】:

    如果你像这样创建对象,它将被触发:

    print(set.items.all().count())  # 
    
    item = Item.objects.first()
    set = Set.objects.first()
    icount = set.items.count() + 1
    SetMeta.objects.create(item=item, set=set, order=icount)
    
    print(set.items.all().count())
    

    请查看documentation了解更多详情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-26
      • 1970-01-01
      • 2018-09-30
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 2019-08-05
      相关资源
      最近更新 更多