Есть ли способ динамически выбрать значение для связанного поля модели во время выполнения?

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

class Thread(models.Model):
    sender = models.(???) # This need to be a field that can store a different model on a run time.
    receiver = models.(???) # same here.

Есть ли способ, которым я могу динамически сначала выбрать модель, а затем выбрать объект из этого списка. Я видел эту функцию в odoo. А есть ли что-нибудь в Джанго?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
119
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать поле «многие ко многим» с несколькими доступными вариантами «Ученик» и «Учитель» из другой модели.

    class UserRole(models.Model):
        STUDENT = 'STUDENT'
        TEACHER = 'TEACHER'
    
        ROLE_CHOICES = (
           (STUDENT, 'student'),
           (TEACHER, 'teacher'),
        )
        role_name = models.CharField(max_length=255, choices=ROLE_CHOICES)

        def __str__(self):
            return "{}".format(self.role_name)

    class User(AbstractUser):
        username = models.CharField(max_length=50, unique=True)
        email = models.EmailField(_('email address'))
        role = models.ManyToManyField(UserRole)

    Class Thread(models.Model):
        sender = models.OneToOneField(User, on_delete=models.CASCADE)
        receiver = models.OneToOneField(User, on_delete=models.CASCADE)

Таким образом, вы можете поместить доступные роли только в поля отправителя и получателя потока.

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

Nomi 23.12.2020 21:18

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

Sohaib 23.12.2020 21:21

Нравится эта модель пользователям. class User(AbstractUser): username = models.CharField(max_length=50, unique=True) email = models.EmailField(_('адрес электронной почты')) profile = models.OneToOneField(UserProfile, on_delete=models.CASCADE) role = модели.ManyToManyField(UserRole)

Sohaib 23.12.2020 21:22

@Nomi, пожалуйста, проверьте отредактированный ответ для лучшего понимания.

Sohaib 23.12.2020 21:26

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

Nomi 24.12.2020 05:10

Используйте наследование для в своей модели и сопоставьте свой внешний ключ с пользователем, а затем передайте объект учителя или ученика.

мои модели не предназначены для этого. У меня есть модель пользователя и модель ученика и учителя. И между учеником и пользователем, а также между пользователем и учителем существует отношение один к одному.

Nomi 24.12.2020 06:05
Ответ принят как подходящий

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

class Test(models.Model):
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

Приятного аппетита.

Другие вопросы по теме