Вложенный запрос / не связанное напрямую поле в Django - PullRequest
0 голосов
/ 05 мая 2020

Если модели следующие,

class Subject(BaseModel):
    name = models.CharField(db_column='name', max_length=200, blank=False, null=False, unique=True)

    class Meta:
        managed = True
        db_table = 'Subject'


class Topic(BaseModel):
    name = models.CharField(db_column='name', max_length=200, blank=False, null=False, unique=True)
    subject = models.ForeignKey(Subject, on_delete=models.CASCADE, null=False, related_name='subject_topic')

    class Meta:
        managed = True
        db_table = 'Topic'


class Question(BaseModel):
    topic = models.ForeignKey(Topic, on_delete=models.CASCADE, null=False, related_name='question_topic')
    class Meta:
        managed = True
        db_table = 'Question'

Как я могу задать вопрос для темы.

questions = Question.objects.filter(topic_in=Topic.objects.get(subject=subject).only('id').all())

, но он не работает. Любая помощь будет действительно большой помощью.

1 Ответ

1 голос
/ 05 мая 2020

Ваш текущий «внутренний набор запросов» не даст вам несколько значений, он возвращает только 1.

Topic.objects.get(subject=subject).only('id').all()

Вы используете .objects.get(), который возвращает экземпляр модели, например, .only() или .all() в этом случае не будет работать, если ваша модель не имеет такой определенной функции.

Кроме того, вам действительно не нужны 2 набора запросов, вы можете получить результат только с одним:

my_subject_ids = [...]  # these are the ids of Subject models you want
Question.objects.filter(topic__subject_id__in=my_subject_ids)

Вы также можете запросить Subject.name, просто используйте для этого следующее: topic__subject__name__in=my_list.

Если вы хотите запросить конкретный c Subject -экземпляр, вы можете использовать topic__subject=my_obj .

Вы также можете посмотреть docs для получения дополнительной информации об этом.

...