Django通过through字段从ManyToMany中提取查询集

时间:2016-07-27 18:51:20

标签: python django

假设我们有这些模型:

class A(models.Model):
   field = models.ManyToManyField(B, through="C")

class B(models.Model):
    value = models.CharField()

class C(models.Model):
    a = models.ForeignKey(A)
    b = models.ForeignKey(B)
    order = models.IntegerField()

是否有提取B的查询集的选项,但是考虑了订单字段?

执行a.c_set.all()返回C类的查询集(但是已经订购了)。

执行a.fields.all()有效,但查询集无序。

我需要一个用于初始化formset的查询集。

我希望这是可以理解的 - 它已经很晚了,我已经无法清楚地思考了......如果有人有任何问题,我会尝试清除它。

提前致谢

2 个答案:

答案 0 :(得分:1)

如果您在模型ordering上放置C,则C上的所有查询集都将遵循该顺序:

class C(models.Model):

    class Meta:
        ordering = ('order', )

现在,如果您想要与B相关的A个对象,则可以根据B的排序对C进行排序:

b_results = a.fields.order_by('c')

如果order_by('c')不够清晰,您可以将模型更改为:

class C(models.Model):
    a = models.ForeignKey(A, related_name='a_relationship')
    b = models.ForeignKey(B)
    order = models.IntegerField()

    class Meta:
        ordering = ('order', )

然后你可以这样做:

b_results = a.fields.order_by('a_relationship')

答案 1 :(得分:0)

使用C模型反向关系来执行订单,例如

a.fields.order_by(c__order)