Я хочу добиться функциональности, в которой мне нужно выбрать модель 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. А есть ли что-нибудь в Джанго?
Вы можете использовать поле «многие ко многим» с несколькими доступными вариантами «Ученик» и «Учитель» из другой модели.
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)
Таким образом, вы можете поместить доступные роли только в поля отправителя и получателя потока.
Для выполнения этого действия вам потребуется дополнительная модель ролей. Также вам нужна только одна пользовательская модель для всех типов пользователей, будь то «ученик» или учитель и т. д. Также используйте ту же модель UserRole с полем роли.
Нравится эта модель пользователям. 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)
@Nomi, пожалуйста, проверьте отредактированный ответ для лучшего понимания.
Я понял. На самом деле то, что я пытался найти, было решением, которое может предоставить мне функциональность, которую я хочу достичь, упомянутую в конце вопроса. Спасибо в любом случае
Используйте наследование для в своей модели и сопоставьте свой внешний ключ с пользователем, а затем передайте объект учителя или ученика.
мои модели не предназначены для этого. У меня есть модель пользователя и модель ученика и учителя. И между учеником и пользователем, а также между пользователем и учителем существует отношение один к одному.
Решение было возможно и с 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')
Приятного аппетита.
Я уже использовал разные модели для ученика, учителя и т. д., каждая из которых подключалась к пользователю один к одному из-за дополнительных полей в каждой.