0

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

我会用一些代码更好地解释。这是我的相关部分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 关系中的存在(检查经理/代表列表的一部分) )。

4

1 回答 1

1

好的,首先,解释一下这两个语法:在过滤器中,你使用Q对象:

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

并测试多对多中的成员资格,您只需使用=

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

这意味着“有一个名为 daniel 的用户”(而不是您可能认为的“只有一个用户,即 daniel”)。

因此,要将这些放在一起,您可以执行以下操作:

Order.objects.filter(Q(vendor__managers=my_user) | 
                     Q(vendor__representatives=my_user))
于 2012-04-08T20:48:55.083 回答