Django: отфильтруйте и отредактируйте model_set объекта и верните набор запросов этого объекта в отношении один ко многим - PullRequest
1 голос
/ 05 марта 2020

Предположим, у меня есть две модели, что между ними существует отношение один ко многим. Это мои модели:

  1. Экзамен
  2. Вопрос

Я хочу получить QuerySet связанных вопросов экзамена объекты, содержащие текст, содержащий q1_text. А также я хочу отфильтровать question_set этих экзаменационных объектов, которые содержат только q1_text.

Это мои Exam и Question модели:

models.py

class Exam(models.Model):
    name = models.CharField(max_length=50)
    level = models.CharField(max_length=10)
    type = models.CharField(max_length=20)
    city = models.ForeignKey(City, on_delete=models.CASCADE)

class Question(models.Model):
    text = models.CharField(max_length=400, default='how are you?')
    exam = models.ForeignKey(Exam, on_delete=models.CASCADE)

Предположим, что в возвращаемых QuerySet существуют объекты вопросов, некоторые из которых иметь текстовое поле со значением q1_text и другие со значением q2_text. Для этой цели я использовал этот фильтр:

Exam.objects.filter(question__text__icontains='q1_text')

Если я использую этот код, я получаю QuerySet объектов экзамена, но есть некоторые вопросы с текстом q2_text в question_set из этих объектов. Однако мне нужны только вопросы, содержащие q1_text, поэтому для меня это неверный результат.

Мне нужно отфильтровать question_set из exam objects. поэтому я использовал этот код:

второй фильтр

Exam.objects.filter(question__text__icontains='q1_text')[i].question_set.all().filter(text__icontains='q1_text')

Но проблема в том, что вывод этого кода QuerySet из Question model, но я хочу QuerySet из Exam model с отредактированным question_set, содержащим только те вопросы, которые содержатся в их text q1_text

Мои предложения:

Возможно один из возможных способов - использовать второй фильтр , а затем установить атрибут question_set из exam objects для его вывода, но я не знаю, как это сделать в коде.

В общем, я думаю, что мы должны найти способ отредактировать или отфильтровать question_set из exam objects и получить QuerySet этих объектов исследования в выводе.

1 Ответ

0 голосов
/ 05 марта 2020

Возьмите его в руки и наслаждайтесь работой с Django ORM!

  1. Прежде всего, добавьте related_name (подробнее: 1 , 2 ) в ваше поле exam в модели Question.
exam = models.Foreign‍‍‍‍Key(Exam, related_name='question_exams', on_delete=models.CASCADE)‍‍‍‍‍‍
Наконец, для установки условий в методе filter используйте объект Q (подробнее: 1 , 2 , 3 ). Попробуйте этот запрос:
    from django.db.models import Q
    q_object = Q(
        Q(question_exams__exam = your_current_exam) and Q(question_exams__text__contains='q1_text')
    )
    final_result = Exam.objects.filter(q_object)

Надеюсь, я могу помочь вам.

...