Фильтр 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
)

Может кто-нибудь объяснить мне, почему это не работает?

+3
источник поделиться
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)
+1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос