Python 在多对多字段上用';通过';领域
使用下面的代码,在执行Python 在多对多字段上用';通过';领域,python,django,many-to-many,Python,Django,Many To Many,使用下面的代码,在执行set\u instance.items.add()时,如何将SetMeta.order默认为len(set.items.all()) 我已尝试在SetMeta上覆盖save(),但在执行add()时未调用save。还尝试使用SetMeta作为发送方发送信号,但SetMeta发送的是Set实例而不是SetMeta实例。看起来应该很简单,但我想不出来 最后,一个集合中的每个项都应该有一个顺序等于len(set\u instance.items.all() 型号.py clas
set\u instance.items.add()
时,如何将SetMeta.order默认为len(set.items.all())
我已尝试在SetMeta上覆盖save(),但在执行add()时未调用save。还尝试使用SetMeta作为发送方发送信号,但SetMeta发送的是Set实例而不是SetMeta实例。看起来应该很简单,但我想不出来
最后,一个集合中的每个项
都应该有一个顺序
等于len(set\u instance.items.all()
型号.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,)
更新。还可以将顺序设置为set.items.count()根据,您可以使用以下任一解决方案:
一个,通过
模型使用:
item = Item.objects.first()
set = Set.objects.first()
icount = set.items.count() + 1
SetItem.objects.create(item=item, set=set, order=icount)
两个,通过默认值使用:
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()
听起来很有趣-那给了我什么?我怎么能利用它?啊-我现在明白了。我需要订单,这样我就可以用up()和down()更新它在SetMeta上定义的方法。我用它对集合类进行排序。用你的方法,使用through_默认值,在信号或模型本身上没有办法做到这一点?我现在必须通过“through”类创建所有模型,以获得此“order”功能?对不起,我不清楚你用through_de对你的方法的有什么要求错误,在信号或模型本身上无法执行此操作?
您能举一些例子吗?我不想改变使用set.items.add()的方式-我希望我的order属性始终默认为set.items.count().在您的帮助下,我现在通过一个post save信号实现了这一点。我在我的SetMeta类上设置了一个名为default_order()的方法,该方法只需将self.order设置为self.set.items.count()。我在通过m2m_changed信号添加的新项目上调用该函数。