我正在尝试为用户提供所有订单,其中用户是订单供应商代表或经理的一部分。
我会用一些代码解释得更好。以下是我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关系中存在(检查管理者/代表的一部分是否列出)。
答案 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))