Как создать сообщение с другим типом пользователя (два внешних ключа для одной модели сообщения)? - PullRequest
1 голос
/ 09 марта 2020

Я работаю над проектом по сценарию: teacher s может сделать курс и опубликовать sh его в Course модели, а также институт может сделать курс в Course модели? как я могу сделать так, чтобы он автоматически выбирал одно из полей foreign key? и институты, и преподаватель могут иметь должность

class Institute(models.Model):
    courses = GenericRelation(Course)
    institute_name = models.OneToOneField(CustomUser,on_delete=models.CASCADE)
    institute_id = models.SlugField(unique=True,default=slug_generator(),blank=True)
    phone_number = models.CharField(max_length=11)
    locations  = models.OneToOneField(Location,on_delete=models.DO_NOTHING,default='')
    institute_name.is_institute = True
    pass...
    def __str__(self):
        return self.institute_name.username

class Teacher(models.Model):
    course = GenericRelation(Course)
    teacher = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
    teacher_slug = models.SlugField(unique=True,default=slug_generator())
    phone_number = models.CharField(max_length=11,default='')
    teacher.is_teacher = True
    certification = models.ForeignKey(Certification,on_delete=models.CASCADE, blank=True,null=True)

    def __str__(self):
        return self.teacher.username

class CustomUser(AbstractUser):
    is_student = models.BooleanField(default=False)
    is_teacher = models.BooleanField(default=False)
    is_institute = models.BooleanField(default=False)
    email = models.EmailField(unique=True)
    objects = UserManager()

    def __str__(self):
        return self.username



class Student(models.Model):
    student = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
    student.is_student = True
    student_slug = models.SlugField(unique=True,default=slug_generator())

    def __str__(self):
        return self.student.username

Затем определите:

if user loggedin in  user.is_institute

Итак, запрос в модели института

else loggedin in user.is_teacher

И тогда будет работать модель преподавателя. Хорошо ли работает эта структура?

Я слышал, что generic foreign keys не работает с API, я тоже пробовал это, но я не знаю, как их запросить

class Course(models.Model):
    course_name = models.CharField(max_length=20)
    tags = models.ManyToManyField(Category)
    time_created  = models.DateTimeField(auto_now_add=True)
    content_type = models.ForeignKey(ContentType , on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type','object_id')

    def __str__(self):
        return self.course_name

from django.contrib.contenttypes.models import ContentType


Teacher ,Institute have different fields name 

Спасибо

1 Ответ

1 голос
/ 10 марта 2020

Я не думаю, что GenericRelation - это то, что вам действительно нужно для этого.

Как насчет немного изменить структуру. Давайте выберем Course в качестве основной модели для задачи.

Например,

class Course(models.Model):
    teacher = models.ForeignKey(Teacher, related_name='courses', on_delete=models.CASCADE, null=True, blank=True)
    institute = models.ForeignKey(Institute, related_name='courses', on_delete=models.CASCADE, null=True, blank=True)
    # other necessary fields

    @property
    def is_teacher(self):
        return self.teacher is not None

    @property
    def is_institute(self):
        return self.institute is not None

После этого вы можете проверить, сделано ли институтом Course, как

if course_object.is_teacher:

Но если вы действительно хотите дифференцировать своих пользователей по институтам или преподавателям, вам необходимо создать собственную модель пользователя, вот отправная точка для вас https://docs.djangoproject.com/en/3.0/topics/auth/customizing/#using -a-custom-user -model-when-start-a-project

В этом случае в вашей Course модели у вас будет только одно поле, например, author = models.ForeignKey(User, related_name='courses', on_delete=models.CASCADE)

Надеюсь, у меня есть поле правильно понял ваш вопрос.

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