django - как объединить результаты нескольких моделей, имеющих внешний ключ одного и того же пользователя? - PullRequest
3 голосов
/ 06 декабря 2011

У меня есть несколько моделей, которые указывают на одного и того же пользователя, как это:

class Model1(moldels.Model):
     user = models.ForeignKey(User)
     title = models.CharField()
     ...

class Model2(moldels.Model):
     user = models.ForeignKey(User)
     ...

class Model3(moldels.Model):
     user = models.ForeignKey(User)
     ...

Что можно сделать для поиска / фильтра в поле title в Model1 и объединить результаты других моделей, имеющих того же пользователя Только Moldel1 будет возвращать несколько результатов для одного и того же пользователя. Model2 и Model3 всегда будут возвращать один результат для каждого пользователя (например, один аватар и один профиль). - Спасибо!

Ответы [ 2 ]

1 голос
/ 06 декабря 2011

Если вы хотите получить набор запросов, это невозможно.Вы не можете получить набор запросов для различных моделей.

Но я думаю, что вы хотите что-то вроде этого:

objs1 = Model.objects.filter(title__icontains='YOUR FILTER')
users = objs1.values('user').distinct()
objs2 = Model2.objects.filter(user__in=users)
objs3 = Model3.objects.filter(user__in=users)

objs = list(objs1)
objs.extend(list(objs2))
objs.extend(list(objs3))
return objs
1 голос
/ 06 декабря 2011

Это зависит от того, что вы подразумеваете под «присоединиться». Вы можете получить доступ к любому из других, хотя user и related_name модели (по умолчанию: <lowercase class name>_set), например ::

model1_instance.user.model2_set.all()

Или вы можете использовать пользовательский экземпляр для прямого доступа к каждому из них:

user.model1_set.all()
user.model2_set.all()
user.model3_set.all()

Вы также можете запросить эти модели через пользователя, используя обратные запросы:

User.objects.filter(model1__title='some title')

Наконец, для моделей, которые имеют только один экземпляр, например, один профиль на пользователя, вам действительно следует использовать OneToOneField вместо ForeignKey. Если вы сделаете это, тогда вы можете использовать select_related для любого обратного отношения, которое является OneToOneField (истинный SQL JOIN), например ::

User.objects.filter(model1__title='some title').select_related('model2', 'model3')

Однако select_related будет , а не работать с обратным отношением внешнего ключа или отношениями "многие ко многим". Для этого вам придется подождать, пока Django 1.4 не выпадет с prefetch_related.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...