Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在多对多字段上用';通过';领域_Python_Django_Many To Many - Fatal编程技术网

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信号添加的新项目上调用该函数。