具有中间模型的 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)
我想检索 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
)
有人可以向我解释为什么这不起作用吗?
在这两种情况下,您都尝试使用默认经理 objects
,而您需要使用关系经理。但是看起来,由于关系不明确,会出现问题,即当查询这样的关系时:
p_user.relations.filter(type_relation=PersonneEnums.RELATION_AMI)
Django 无法决定是否应在此查询中使用 src
或 dst
。
以下查询应该有效:
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)
我有以下型号:
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
)
有人可以向我解释为什么这不起作用吗?
在这两种情况下,您都尝试使用默认经理 objects
,而您需要使用关系经理。但是看起来,由于关系不明确,会出现问题,即当查询这样的关系时:
p_user.relations.filter(type_relation=PersonneEnums.RELATION_AMI)
Django 无法决定是否应在此查询中使用 src
或 dst
。
以下查询应该有效:
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)