繁体   English   中英

Django Manytomany过滤器与中间模型

[英]Django Manytomany filter with intermediate model

我有以下型号:

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)

我想检索PersonneEnums.RELATION_FRIEND类型的p_user所有关系

我尝试了很多东西,包括以下代码,但没有任何作用:

不起作用:

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
)

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

在这两种情况下,您都尝试使用默认管理器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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM