наборы запросов в моделях с множеством полей (Джанго) - PullRequest
0 голосов
/ 26 апреля 2018

Мой вопрос связан с созданием наборов запросов для моделей, которые связаны между собой по многим и многим полям.

context - приложение, в которое входит ученик и которое должно оценить своих учителей.Вопросы, которые приложение показывает ученику, имеют следующую логику: каждый ученик должен оценить некоторых учителей.У каждого учителя есть различные категории вопросов, связанных с ними («интеллект», «уважение», «сочувствие» и т. Д.), И у каждой из этих категорий есть несколько вопросов, связанных с ним.

Модели:

class Items(models.Model):
     item = models.TextField()
     def __str__(self):
          return self.item

class Categories(models.Model):
    category = models.CharField(max_length=50,null=True)
    items_associated  = models.ManyToManyField(Items)
    def __str__(self):
       return self.category

class Professors(models.Model):
    professor = models.CharField(max_length=50,null=True)
    categories_assigned = models.ManyToManyField(Categories)
    def __str__(self):
       return self.professor

class Students(models.Model):
    student_logged = models.CharField(max_length=50,null=True)
    professors_to_evaluate = models.ManyToManyField(Professors)
    def __str__(self):
       return self.student_logged

когда ученик входит в сеть, у него есть несколько ассоциированных учителей (модель учеников), которым в свою очередь назначаются некоторые категории учителей (профессора модели), а эти категории, в свою очередь, связаны с некоторыми вопросами (категории модели). Я хочу сохранить в словаре эти вопросы, которые есть в моделях Предметов. Как я могу это сделать?

Я пытался отфильтровать и __in, но не могу его получить.

Большое спасибо и спасибо за мудрость

Редактировать: Я попытаюсь привести вам пример, потому что я думаю, что это может быть немного трудно объяснить.


ученик должен квалифицировать своих учителей, которые являются профессором Рика и учителем барни .


Рик-профессор будет оцениваться по категориям вопросов: уважительное отношение и технические знания .


категорияиз уважительного обращения есть вопросы, связанные с ним:

  • учитель относится ко всем одинаково
  • учитель не говорит грубых вещей
  • Учитель добрый

Технические знания Категория имеет вопросы, связанные с ней:

  • He учит ясно
  • Он демонстрирует передовые знания

Так что я хочу, чтобы, когда tom-student входит в сеть, чтобы оценить Rick-Professor, приложение покажет ему соответствующуювопросы, которые в данном случае:

  • учитель относится ко всем одинаково
  • учитель не говорит грубых вещей
  • учитель добрый
  • Он преподает ясно
  • Демонстрирует передовые знания

Затем, когда он пойдет на оценку учителя барни, веб-сайт покажет ему несколько разных вопросов в соответствии с категориями, которые назначил учитель барни.,

1 Ответ

0 голосов
/ 26 апреля 2018

Я настоятельно рекомендую вам использовать атрибут related_name.Я добавил _x к связанным именам, чтобы сделать запрос более очевидным.

class Items(models.Model):
     item = models.TextField()
     def __str__(self):
          return self.item

class Categories(models.Model):
    category = models.CharField(max_length=50,null=True)
    items_associated  = models.ManyToManyField(Items, related_name='category_x')
    def __str__(self):
       return self.category

class Professors(models.Model):
    professor = models.CharField(max_length=50,null=True)
    categories_assigned = models.ManyToManyField(Categories, related_name='professor_x')
    def __str__(self):
       return self.professor

class Students(models.Model):
    student_logged = models.CharField(max_length=50,null=True)
    professors_to_evaluate = models.ManyToManyField(Professors, related_name='student_x')
    def __str__(self):
       return self.student_logged

items_for_student = Items.objects.filter(category_x__professor_x__student_x=student)

Но и соглашения об именах, которые вы используете для полей, немного странны.Ниже я использовал лучшие практики, чтобы вы могли увидеть, как это будет выглядеть.

  1. Не используйте поле с тем же именем, что и у модели
  2. Модели должны быть единичными (за редкими исключениями)
  3. Для отношений ManyToMany или ForeignKey должно быть указано имя модели для создания собственного документа.

С этими правилами вот как выглядит наилучшая практика.

class Item(models.Model):
     name = models.TextField()
     def __str__(self):
          return self.name

class Category(models.Model):
    name = models.CharField(max_length=50,null=True)
    items = models.ManyToManyField(Item, related_name='categories')
    def __str__(self):
       return self.name

class Professor(models.Model):
    name = models.CharField(max_length=50,null=True)
    categories = models.ManyToManyField(Category, related_name='professors')
    def __str__(self):
       return self.name

class Student(models.Model):
    name = models.CharField(max_length=50,null=True)
    professors = models.ManyToManyField(Professor, related_names='students')
    def __str__(self):
       return self.name

И с такой структурой запрос будет выглядеть следующим образом:

items = Item.objects.filter(categories__professors__students=student)

Также обратите внимание, что приведенный выше запрос будет стоить очень дорого для выполнения в базе данных, как это было быоцените до 3 соединений.

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