/ / querysets в модели с многобройни полета (Django) - django, django-модели, много-много-много, django-queryset

заявки в модели с многобройни полета (Django) - django, django-модели, много-много-много, django-queryset

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

контекст - приложение, в което студентът влиза и трябваоценете неговите учители. въпросите, които приложението показва на ученика имат следната логика: всеки ученик трябва да оцени някои учители. Всеки учител има различни категории въпроси, свързани с тях ("интелигентност", "уважение", "съпричастност" и т.н.) и всяка от тези категории има някои въпроси, свързани с него.

Моделите са:

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

когато студент влезе в мрежата има някои асоциираниучители (модел Студенти) тези учители от своя страна имат определени категории (модел професори), тези категории от своя страна имат някои въпроси, свързани (модел Категории). Искам да запазя в речник тези въпроси, които са в модела елементи. Как мога да го направя?

Опитах се да филтрирам и __в, но не мога да го получа.

Много благодаря и благодаря за мъдростта

Редактиране: Ще се опитам да ви дам пример, защото мисля, че може да е малко трудно да се обясни.


Том-студент трябва да квалифицира своите учители, които са Рик-професор и Барни-учител.


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


категорията на почтителен лечението има въпроси, свързани с него:

  • учителят се отнася към всички еднакво
  • учителят не казва груби неща
  • учителят е мил

на технически познания категорията има въпросите, свързани с нея:

  • Той преподава ясно
  • Той демонстрира напреднали знания

Така че това, което искам, е, че когато студент-студент влезе в интернет, за да оцени Rick-професора, приложението ще му покаже свързаните въпроси, които в този случай са:

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

След това, когато той отиде да оцени barney-учител, уебсайтът ще му покаже някои различни въпроси според категориите, които barney-учителят е определил.

Отговори:

0 за отговор № 1

Силно ви препоръчвам да използвате 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 присъединявания.