Как правильно назначить сквозной атрибут в Django? - PullRequest
0 голосов
/ 10 мая 2018

Я просто искал документацию, чтобы можно было изменить промежуточную таблицу, но когда я ее реализую, у меня возникают проблемы:

https://docs.djangoproject.com/en/2.0/topics/db/models/#extra-fields-on-many-to-many-relationships

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

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_name='students')
    def __str__(self):
       return self.name

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

Я хочу изменить промежуточную таблицу student_professor, чтобы добавить поле, в котором, когда ученик оценивает учителя, это записывается в базу данных.Я попробовал это с:

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_name='students',through='Studentprofesor' )
    def __str__(self):
        return self.name

class Studentprofesor(models.Model):
    student = models.ForeignKey(Student, on_delete=models.CASCADE)
    professor =  models.ForeignKey(Professor, on_delete=models.CASCADE)
    tested = models.BooleanField(default=False)

Миграция работает без проблем, и в базе данных я получаю промежуточную таблицу student_professor с полями, которые я назначил в модели (поле tested).

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

Почему это происходит и как это можно исправить?

1 Ответ

0 голосов
/ 11 мая 2018

Это по замыслу.Django не может автоматически генерировать виджет для ManyToMany отношений, которые используют таблицу through из-за необходимых дополнительных данных (tested в вашем случае).From Django docs :

Когда вы указываете посредническую модель, используя аргумент through для ManyToManyField, администратор не будет отображать виджет по умолчанию.Это связано с тем, что для каждого экземпляра этой промежуточной модели требуется больше информации, чем можно было бы отобразить в одном виджете, а компоновка, требуемая для нескольких виджетов, будет варьироваться в зависимости от промежуточной модели.

Однако мы все еще хотим иметь возможностьредактировать эту информацию в строке.К счастью, это легко сделать с помощью моделей встроенного администратора.

Лучше всего создать модель встроенного администратора, как описано в документации.

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