Django запрос на основе результатов другого запроса - PullRequest
1 голос
/ 25 апреля 2020

У меня есть 4 модели в упрощенном дизайне

class modelA(models.Model):
     name = models.CharField()

class modelsUser(model.Model):
     username = models.CharField()

class bridge(models.Model):
     user = models.ForeignKey(modelUser, on_delete=models.CASCADE, related_name='bridges')
     modelA = models.ForeignKey(modelA, on_delete=models.CASCADE, related_name='bridges')

class subModelA(models.Model):
     modelA = models.ForeignKey(modelA, on_delete=models.CASCADE, related_name='subModelAs')
     value = models.IntegerField()

class subModelB(models.Model):
     modelA = models.ForeignKey(modelA, on_delete=models.CASCADE, related_name='subModelBs')
     text = models.TextField()

Я пытаюсь получить все subModelB с и subModelA с, которые предназначены для modelA с, для которых дано modelUser есть bridge.

Я начал с этого:

user = modelUser.objects.get(pk=1)
bridges = user.bridges.all()

Я думал примерно так:

subModelBs = subModelB.objects.filter(modelA__in=bridges__modelA)

, но к сожалению, это не работает из-за ошибки, __modelA is not defined.

Есть ли какой-нибудь правильный способ сделать это?

Ответы [ 2 ]

3 голосов
/ 25 апреля 2020

Сначала найдите modelAs, а затем выполните два других запроса:

modelAs = bridge.objects.filter(user__pk=1).values_list('modelA', flat=True)

subModelAs = subModelA.object.filter(modelA__in=modelAs)
subModelBs = subModelB.object.filter(modelA__in=modelAs)
1 голос
/ 25 апреля 2020

Хороший вопрос, прежде всего!

Пробовал воспроизводить на моей системе, у меня сработало следующее:

user = modelUser.objects.get(pk=1)
bridges = user.bridges.all()
subModelAs = subModelA.objects.filter(
    modelA_id__in=[x.modelA_id for x in list(bridges)]
)

И аналогично для subModelBs. Надеюсь, это поможет вам хорошо.

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