#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)