Получение всех строк таблицы вместе с соответствующими строками другой таблицы в 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/