Фильтр Django Manytomany с промежуточной моделью
У меня есть следующие модели:
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
)
Может ли кто-нибудь объяснить мне, почему это не работает?1 ответ:
В обоих случаях вы пытаетесь использовать менеджер по умолчанию
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)