Въпросът ми е свързан с изработване на заявки за модели, които са свързани помежду си в много до много полета.
контекст - приложение, в което студентът влиза и трябваоценете неговите учители. въпросите, които приложението показва на ученика имат следната логика: всеки ученик трябва да оцени някои учители. Всеки учител има различни категории въпроси, свързани с тях ("интелигентност", "уважение", "съпричастност" и т.н.) и всяка от тези категории има някои въпроси, свързани с него.
Моделите са:
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)
Но и конвенциите за именуване, които използвате за полетата, са малко странни. Използвах най-добрите практики по-долу, за да видите как би изглеждало това.
- Не трябва да има поле със същото име като модела
- Моделите трябва да бъдат единични (с редки изключения)
- Отношенията 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 присъединявания.