如何在一个混乱的遍历中编写一个Django查询,该遍历在M2O中向后然后转发到M2M

时间:2012-04-08 20:34:51

标签: python django django-models django-queryset

我正在尝试为用户提供所有订单,其中用户是订单供应商代表或经理的一部分。

我会用一些代码解释得更好。以下是我models.py

的相关部分
class Vendor( models.Model ) :
    managers        = models.ManyToManyField( User, related_name = 'managers'       , limit_choices_to = { 'userprofile__user_types' : 4 } )
    representatives = models.ManyToManyField( User, related_name = 'representatives', limit_choices_to = { 'userprofile__user_types' : 5 }, null = True, blank = True )

class Order( models.Model ) :
    creator  = models.ForeignKey( User, related_name = 'creator' )
    approver = models.ForeignKey( User, related_name = 'approver' )
    vendor   = models.ForeignKey( Vendor, null = True, blank = True )

class UserType( models.Model ) :
    name = models.CharField( max_length = 135 )

    # id |       name
    #----+------------------
    #  1 | tenant
    #  2 | property manager
    #  3 | property owner
    #  4 | vendor manager
    #  5 | vendor
    #  6 | viewer
    #  7 | moderator
    #  8 | administrator

class UserProfile( models.Model ) :
    user       = models.OneToOneField( User )
    user_types = models.ManyToManyField( UserType, null = True, blank = True )

要获得用户创建的所有订单,请轻松:

Order.objects.filter( creator = user.pk )

我无法弄清楚如何获得这个的原因是因为我无法弄清楚filter如何使用OR子句(经理代表)或检查在M2M关系中存在(检查管理者/代表的一部分是否列出)。

1 个答案:

答案 0 :(得分:1)

好的,首先,要解释这两个句法:对于过滤器中的OR,使用Q个对象:

from django.db.models import Q
results = MyModel.objects.filter(Q(name='daniel') | Q(status='fantastic'))

要测试ManyToMany中的成员资格,只需使用=

即可
results = MyModel.objects.filter(user__name='daniel')

表示“有一个名为daniel的用户”(而不是,你可能认为,“只有一个用户,即daniel”)。

所以,把这些放在一起,你可以做到:

Order.objects.filter(Q(vendor__managers=my_user) | 
                     Q(vendor__representatives=my_user))