Как сделать запрос на основе FK? - PullRequest
0 голосов
/ 01 сентября 2018

У меня две модели. на мой взгляд, я хочу вернуть ссылку Model1 на Model2, фильтруя зарегистрированного пользователя приписывается ModelTwo. Вот мой models.py

ModelOne(models.Model):
name = models.CharField(max_length=64, unique=True)
description = models.TextField()

ModelTwo(models.Model):
model_one = models.ForeignKey(ModelOne, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)

На мой взгляд, я хочу получить результат, который пользователь приписал ModelTwo при получении PK для ModelOne.

Я попробовал это, но ПК получает ModelTwo, и я хочу ПК для ModelOne:

def get_queryset(self):
    return ModelTwo.objects.filter(user=self.request.user)

Я видел '__' (подчеркивание, подчеркивание), чтобы сделать запросы о других классах (FK), но я не сделал это. Другая вещь, это related_name, с которой есть форма, которую интересно использовать.

Кто-нибудь может мне помочь? Большое спасибо за внимание, друзья мои.

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

В основном у вас есть несколько вариантов:

Если вам просто нужны ModelOne PK, то:

set(ModelTwo.objects.filter(user=self.request.user).values_list('model_one__pk', flat=True))

Я использовал set для удаления дубликатов.

Другой вариант - получить ModelOne s, которые имеют отношение к ModelTwo с соответствующим пользователем. Я думаю, что лучше:

ModelOne.objects.filter(model_two_set__user=self.request.user).values_list('pk', flat=True)
0 голосов
/ 01 сентября 2018

ОК, помните, что ForeignKey - это отношения один ко многим. К одному пользователю может быть подключено несколько записей ModelTwo. Чтобы получить все записи ModelTwo для пользователя, вы можете либо сделать ModelTwo.objects.filter(user=self.request.user), либо использовать связанное по умолчанию имя user.modeltwo_set.all().

Чтобы получить все ModelOnes, вы можете использовать что-то вроде

ModelOne.objects.filter(id__in=user.modeltwo_set.values_list('pk'
, flat=True))

И вы можете использовать related_name в определении модели, чтобы заменить значение по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...