2016-07-27 74 views
0

说我们有那些机型:的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的的queryset的,但考虑到为了领域?

做一个a.c_set.all()返回C类的queryset(但它是有序的)。

做一个a.fields.all()的作品,但查询集是无序的。

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

我希望这是可以理解的 - 现在已经很晚了,我已经不能清楚了......如果有人有任何问题,我会尽力澄清。

在此先感谢

回答

1

如果您在模型C放了一个ordering,在C所有查询集将服从该命令:

class C(models.Model): 

    class Meta: 
     ordering = ('order',) 

现在如果你想与AB对象,你可以排序B S综合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') 
+0

谢谢!这很好用:) 你能解释一下,它是如何工作的,A对象包含字段和fields_set属性?如果没有这样的字段,为什么我可以通过'c'命令a.fields: – Noiseapps

+1

它与外键和m2m字段的'related_name'有关。 Django文档详细介绍了这一点:https://docs.djangoproject.com/en/dev/topics/db/queries/#backwards-related-objects –

0

使用C模型反向关系做了顺序,例如

a.fields.order_by(c__order)