【问题标题】:Django Manytomany filter with intermediate model带有中间模型的 Django Manytomany 过滤器
【发布时间】:2016-06-16 21:16:22
【问题描述】:

我有以下型号:

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
)

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

【问题讨论】:

  • “不起作用”是什么意思?错误?结果无效?

标签: python django django-models django-orm


【解决方案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)

【讨论】:

  • 如果我尝试您的解决方案,我会收到此错误:Cannot resolve keyword 'type_relation' into field. Choices are: ...(list of all the properties of the model **Personne**)
  • 如果我尝试p_user.relations.filter( relations__type_relation=PersonneEnums.RELATION_AMI ) 我得到:TypeError at /xx Related Field got invalid lookup: type_relation
  • @OliverPons,请查看最后一个答案更新,必须进行多次编辑,但这应该可以解决问题。
  • 好的,非常感谢,我几乎在你写答案的时候就找到了:我使用了 PersonneRelations.objects.filter() 的东西,但我的查询要复杂得多,因为 src 可能是 p_user 但是dst 也可以是 p_user(= 如果当前用户邀请某人或被邀请)所以我必须(1)进行查询以提取所有 src 关系(2)另一个查询以提取所有 @ 987654338@ 关系,(2) 加入两个查询并仅保留 Personne 结果为 RELATION_AMI。如此复杂的查询.. 很难向我的客户解释复杂性
猜你喜欢
  • 2018-09-29
  • 2011-12-14
  • 1970-01-01
  • 1970-01-01
  • 2016-07-23
  • 2016-04-11
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多