Как получить объект, используя фильтр на ManyToManyField

Почему target_dialogue всегда None?

Модель:

class Dialogue(models.Model):
    name = models.CharField(max_length=30, blank=True)
    is_conference = models.BooleanField(default=False)

    participants = models.ManyToManyField(
        Person,
        related_name='dialogues',
    )

    def __str__(self):
        return self.name or str(self.pk)

И в связи с этим я хочу получить подходящий диалог, который содержит в поле участников 2 объекта - пользователь и собеседник. И если этот диалог не существует, я создаю его:

        target_dialogue = None
        try:
            target_dialogue = Dialogue.objects.get(is_conference=False,participants__in=[user, companion])
        except ObjectDoesNotExist:
            target_dialogue = Dialogue()
            target_dialogue.save()
            target_dialogue.participants.add(user)
            target_dialogue.participants.add(companion)
        finally:
            return render(request, 'dialogues/dialogue.html', {
                'dialogue': target_dialogue,
            })

Но target_dialogue всегда None. В чем причина? Я должен был решить только проблему в получении диалога от db для плохих параметров фильтра, но теперь у меня есть сомнения по этому поводу. Может быть, что-то еще?

1 ответ

Решение

request.user не является объектом Person модель, с которой у вас есть отношения в диалоге.

Вы должны сначала получить объект person:

user = Person.objecs.get(user=request.user). # According to your person model

Выполните то же самое для компаньона, а затем сделайте запрос:

target_dialogues = Dialogue.objects.filter(is_conference=False,participants__in=[user,companion]
Другие вопросы по тегам