使用 'through' 字段覆盖多对多字段上的 save()



使用下面的代码,在执行set_instance.items.add()时,我如何让 SetMeta.order 默认为len(set.items.all())

我已经尝试在 SetMeta 上骑 save(),但在执行 add() 时没有调用 save。还尝试了使用 SetMeta 作为发送方的信号,但 SetMeta 发送的是 Set 实例而不是 SetMeta 实例。似乎应该很简单,但我无法弄清楚。

最终,set中的每个item都应该具有等于len(set_instance.items.all()order

models.py

class Item(models.Model, AdminVideoMixin):
title = models.TextField(max_length=5000)
**** LOTS OF OTHER FIELDS ****

class Set(Item):
front_page = models.BooleanField(max_length=300, blank=False, default=False, null=False)
items = models.ManyToManyField(Item, related_name='in_sets', through='SetMeta', max_length=5000,)

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,)

更新。也可以order设置为 set.items.count()

根据documentation,您可以使用以下任一解决方案:

、使用through模型:

item = Item.objects.first()
set = Set.objects.first()
icount = set.items.count() + 1
SetItem.objects.create(item=item, set=set, order=icount)

、使用through_defaults

item = Item.objects.first()
set = Set.objects.first()
icount = set.items.count() + 1
set.items.add(item, through_defaults={'order':icount})

仅供参考,(根据您的更新部分),对于您的情况,您无需通过模型存储订单。可以添加属性方法来查看数据:

class SetMeta(models.Model):
...
@property
def order(self):
return self.set.items.count()

相关内容

最新更新