2016-03-03 49 views
3

我有以下型号:Django的多对多滤波器中间模型

class Personne(BaseModel): 
    user = models.OneToOneField(User) 
    relations = models.ManyToManyField('self', through='PersonneRelation', 
             symmetrical=False, 
             related_name='personne_relations') 

class PersonneRelation(BaseModel): 
    type_relation = models.IntegerField(
     choices=[(a, b) for a, b in list(PersonneEnums.TAB_RELATIONS.items())], 
     default=PersonneEnums.RELATION_FRIEND) 
    src = models.ForeignKey('Personne', related_name='relation_src') 
    dst = models.ForeignKey('Personne', related_name='relation_dst') 

在我看来,我必须通过

p_user = Personne.objects.get(user=view.request.user) 

我想要检索的p_user所有的关系,当前登录的用户是是类型PersonneEnums.RELATION_FRIEND

我已经尝试了很多东西,包括下面的代码,但没有任何工作:

不起作用:

p_user.objects.filter(relations__type_relation__exact=PersonneEnums.RELATION_AMI) 

不起作用:

Personne.objects.filter(
    pk=p_user.pk, 
    relations__type_relation__exact=PersonneEnums.RELATION_AMI 
) 

有人能向我解释为什么这不起作用?

+0

什么是 “不工作” 是什么意思?错误?结果无效? – Sayse

回答

1

在这两种情况下,你想用默认的管理员objects,当你需要使用一个关系经理。不过现在看来,这会有一个问题,因为关系是模糊的,即当这样的查询关系:

p_user.relations.filter(type_relation=PersonneEnums.RELATION_AMI) 

的Django无法决定是否应该在此查询使用srcdst

下面的查询应该工作:

PersonneRelations.objects.filter(
    Q(type_relation=PersonneEnums.RELATION_AMI), Q(src=p_user) | Q(dst=p_user)) 

还,这样的事情可能工作(见filter解释):

p_user.relations.filter(relation_src__type_relation=PersonneEnums.RELATION_AMI 
       ).filter(relation_dst__type_relation=PersonneEnums.RELATION_AMI) 
+0

如果我尝试您的解决方案,我得到这个错误:'无法解析关键字“type_relation”到现场。选择是:...(模型的所有属性列表** Personne **)' –

+0

如果我尝试'p_user.relations.filter( relations__type_relation = PersonneEnums.RELATION_AMI )'我得到:'TypeError at/xx相关字段得到无效查找:type_relation' –

+0

@OliverPons,请参阅答案更新。 – Nikita