#django #django-models #django-views #django-queryset
#django #django-модели #django-просмотры #django-набор запросов
Вопрос:
У меня есть несколько таких моделей:
class Model1(models.Model):
user = models.ForeignKey(User)
model1_filed1 = models.CharField()
class Model2(models.Model):
user = models.ForeignKey(User)
model2_filed1 = models.CharField()
....
Как вы можете видеть, все модели имеют файл user = models.ForeignKey(User)
для каждой модели, поэтому, когда я сохраняю данные своей модели, я знаю, какой пользователь их сохранил.
В моем проекте мне нужно:
-
Выполните поиск по model1_filed1 (Moldel1). Что-то вроде поиска всех записей из Model1, в которых model1_filed1 содержит строку «foo».
-
Как только я найду записи Model1, содержащие tring «foo» в mode1_filed1, объедините все записи из Model2, которые имеют тот же идентификатор пользователя, что и только что найденные записи Model1.
Какие-либо ide?
Ответ №1:
# 1
m1 = Model1.objects.filter(model1_filed1__contains='foo')
# 2
m2 = Model2.objects.filter(user__in=[x.user_id for x in m1])
# or one-liner for # 2, may be heavier for DB than two requests
m2 = Model2.objects.filter(user__model1__model1_filed1__contains='foo')
Комментарии:
1. Вероятно, это сработало бы, просто я надеялся, что есть способ выполнить какое-то соединение, поэтому вместо двух выражений m1 и m2 будет только m1, который выполнит всю работу.
2. Можно ли это сделать также на Model1 и как? Прямо сейчас все «действия» выполняются в Model2, но из-за некоторого существующего кода я бы предпочел выполнить объединение в Model1.
3. @avatar Просто замените
model1
наmodel2
и наоборот.