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

OK、まず最初に、これらの2ビットの構文を説明します。フィルターで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のユーザーがいる」ことを意味します(「1人のユーザー、つまりdanielしかいない」とは思わないかもしれません)。

したがって、これらをまとめるには、次のことができます。

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