Получение всех строк таблицы вместе с соответствующими строками другой таблицы в django ORM с помощью select_related

У меня есть 2 модели

Модель 1

class Model1(models.Model):
        id = models.IntegerField(primary_key=True)
        name = models.CharField(max_length=255)
        type = models.CharField(max_length=255)
        details = models.TextField(max_length=1000)
        price = models.FloatField()

Модель 2

class Model2(models.Model):
    id = models.IntegerField(primary_key=True)
    user_id = models.ForeignKey(
        User,
        on_delete=models.CASCADE
    )
    plan_selected = models.ForeignKey(Model1)

Я пытаюсь проверить, выбрал ли пользователь какие-либо планы.

Поле plan_selected является внешним ключом для Model1 - id. Я хочу получить все детали Model1 вместе с деталями Model2 в одной строке набора запросов, используя Django.

До сих пор я пытался получить :

sub_details = Model1.objects.select_related('Model2').filter(user_id=id)

Для select_related() вы хотите выбирать по имени поля, а не по имени связанной модели. Но все, что это делает, это добавляет соединение, извлекает все строки, полученные в результате этого соединения, а затем ваши представления python имеют это отношение в кэше (больше никаких запросов при обращении). Вам также нужно использовать __ для перехода к отношениям через поиск. Документация здесь: https://docs.djangoproject.com/en/4.1/ref/models/querysets/#select-related

Но вам даже не нужна select_related() для вашей цели: "Я пытаюсь проверить, выбрал ли пользователь какие-либо планы". Модель1 здесь не нужна. Это будет, учитывая идентификатор пользователя user_id:

Model2.objects.filter(user_id=user_id).exists()

# OR if you have a User instance `user`:

user.model2_set.exists()

Если же вы хотите "все экземпляры Model1, связанные с user через Model2":

Model1.objects.filter(model2__user_id=user_id).all()

, к которому вы можете подключить цепочку prefetch_related('model2_set') (это 1 -> Many, так что вы делаете предварительную выборку, а не выборку - т.е. за один раз набирает и кэширует заранее все связанные экземпляры model2 результатов). Однако, это было бы проще сделать с помощью поля ManyToMany с User на Model1, минуя необходимость Model2 полностью (которая по существу является просто сквозной таблицей здесь): https://docs.djangoproject.com/en/4.1/topics/db/examples/many_to_many/

Вернуться на верх