使用“通过”字段覆盖多对多字段上的save()

时间:2019-06-10 10:47:53

标签: python django many-to-many

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

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

最终,item中的每个set应该具有等于order的{​​{1}}

models.py

len(set_instance.items.all()

更新。也可以将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,) 设置为set.items.count()

1 个答案:

答案 0 :(得分:1)

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

一个,请使用var children = null chidren.map(i => {return i}) // => VM370:1 Uncaught TypeError: Cannot read property 'map' of null React.Children.map(children, i => {return i;}) // return null 模型:

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