django — как я могу объединить две модели с внешними ключами для одних и тех же пользователей?

#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) для каждой модели, поэтому, когда я сохраняю данные своей модели, я знаю, какой пользователь их сохранил.

В моем проекте мне нужно:

  1. Выполните поиск по model1_filed1 (Moldel1). Что-то вроде поиска всех записей из Model1, в которых model1_filed1 содержит строку «foo».

  2. Как только я найду записи 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 и наоборот.