使用下面的代码,在执行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()