Получение набора запросов из другого набора запросов через отношение OneToOne

#python #django

#python #django

Вопрос:

У меня есть две модели как

 class modelA(models.Model):
     user = models.OneToOneField(User, on_delete=models.CASCADE)
  

и

 class modelB(models.Model):
     user = models.OneToOneField(User, on_delete=models.CASCADE)
     age = models.IntegerField()
  

Я создал запрос как:

 query_set = modelB.objects.filter(age__gte=20)
  

Теперь, как я могу получить набор запросов ModelA из query_set

Комментарии:

1. Что вы подразумеваете под «получением qs модели из qs»? Вам нужны только modelA поля в результате или вы хотите фильтровать по modelA полям в вашем наборе запросов?

2. Мне нужен набор запросов modelA после приведенной выше фильтрации, а затем применить к нему фильтры. Одно можно быть уверенным, что пользователи, имеющие modelB , всегда будут иметь modelA

Ответ №1:

вы можете сделать что-то вроде:

 list_comprehension
user_ids = [item.user.pk for item in query_set]
  

используйте идентификаторы пользователя для фильтрации в модели

 modelA.objects.filter(user__id__in=user_ids)

this will give you all modelA objects that share the same user with modelB
  

Еще лучше было бы просто запросить из модели User.

 users = User.objects.filter(modelb__age__gte=20)
  

если вы хотите проверить, что отношение modelb или modela не является пустым, добавьте к нему следующие фильтры:

 users = User.objects.filter(modelb__isnull=False, modela__isnull=False, modelb__age__gte=20)
  

от пользователя вы можете сделать следующее

 for user in users:
    user.modela
    user.modelb
  

Комментарии:

1. Может users = User.objects.filter(modelb__age__gte=20) применяться, даже если вся пользовательская модель не имеет modelB

2. Хороший вопрос, лучше всего было бы попробовать это. Я думаю, что он будет подбирать пользователей только там, где существует modelb. Но это предположение.

3. Я попробовал это, и это возвращает пользователей, modelB которых существует

4. если вы хотите проверить, не является ли это none, вы можете добавить это в фильтр. таким образом, это становится похоже на: User.objects.filter(modelb__isnul=False, modela__isnull=False, modelb__age__gte= 20)