2016-10-01 14 views
0

のForeignKeyフィールドを選択:フィルターモデルオブジェクト、私はジャンゴでこれらのモデルを持っている

class Person(models.Model): 
    ... 

class Group(models.Model): 
    ... 

class Membership(models.Model): 
    person = models.ForeignKey(Person, related_name='memberships') 
    group = models.ForeignKey(Group, related_name='memberships') 
    is_admin = models.BooleanField(default=False) 

私はPersonインスタンスのリストとして、管理者に返すグループメソッドをしたいです。
これらは私が見つけた2つのソリューションです:

class Group(models.Model): 
    ... 

    @property 
    def admins1(self): 
     admin_ids = list(self.memberships.filter(is_admin=True).values_list('person', flat=True)) 
     return list(map(lambda ai: Person.objects.get(pk=ai), admin_ids)) 

    @property 
    def admins2(self): 
     admin_memberships = list(self.memberships.filter(is_admin=True)) 
     return list(map(lambda am: am.person, admin_memberships)) 

あなたは、例えば、より良いアイデアを持っていますかperson_idsの代わりにPersonインスタンスを保持するvalues_listのようなQuerySetメソッド?

答えて

3

ここでの原則は、Personインスタンスが必要な場合は常にPersonから開始します。そして、それは単に関係を次の問題になり:あなたが明示的としてそれを定義した場合、あなたのクエリが明確になるよう

Person.objects.filter(membership__is_admin=True, membership__group=self) 

はまた、会員は個人とグループ間の多対多の関係の貫通表であることに注意してくださいこうした:

class Person(models.Model): 
    ... 
    groups = models.ManyToManyField("Group", through="Membership") 

今、上記のクエリを使用できます

Person.objects.filter(membership__is_admin=True, groups=self) 
+1

この原則は、便利な学習で、あなたに感謝。 – danbal

関連する問題