Запрос внешнего ключа - PullRequest
0 голосов
/ 06 мая 2020

У меня есть следующие модели:

class status(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    #data
class next(models.Model):
    sender = models.ForeignKey(User, on_delete=models.CASCADE, related_name='sender')
    target = models.ForeignKey(User, on_delete=models.CASCADE, related_name='target')
    #data
class settings(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
        #data

, и я хочу запросить следующий и статус со следующим выводом: next, nextdata, status (target)

=> Прикрепите статус цель для (следующего) набора запросов

Возможно ли это через Django Query? Или я должен просто написать raw SQL

#

Edit: отправитель в этом запросе всегда current.user, и каждый пользователь имеет ровно 1 статус

#

ура, keslol

1 Ответ

0 голосов
/ 06 мая 2020

Вы можете получить данные статуса с помощью select_related или values, если вы запрашиваете "следующую" модель. Вероятно, вам следует добавить параметр related_name к пользователю в вашей модели статуса. Вот два способа (после добавления связанного_имя в качестве статуса):

Выбрать родственное

for next_instance in next.objects.filter(...).select_related('target__status'):
    # next_instance data is accessible directly through instance attributes
    next_instance.id
    # Because we select_related status, no extra query is done to grab the data for target
    # or status
    next_instance.target.status.id

В качестве небольшого примечания используется select_related здесь вместо prefetch_related , поскольку мы проходим ОТ многих ДО 1. Если бы мы перешли ОТ ПОЛЬЗОВАТЕЛЯ К следующему (от 1 до многих), нам пришлось бы использовать prefetch_related , и мы бы не быть в состоянии гарантировать только один результат.

Значения

data = next.objects.filter(...).values(
    # fields you want as string arguments
    'id',
    'target__status__id'
)
# Data will be a Queryset that if you iterate through will be iterating through 
# dictionaries that contain key value pairs for the fields you put in values.

Дополнительная информация:

Вот документация Queryset для select_related: https://docs.djangoproject.com/en/3.0/ref/models/querysets/#select -связано

Вот документация Queryset для значений: https://docs.djangoproject.com/en/3.0/ref/models/querysets/#values

...