Python 如何创建具有不同用户类型的帖子(一个帖子模型有两个外键)?

Python 如何创建具有不同用户类型的帖子(一个帖子模型有两个外键)?,python,django,database,django-rest-framework,foreign-keys,Python,Django,Database,Django Rest Framework,Foreign Keys,我正在做一个项目场景:老师可以制作课程并在课程模型中发布,学院也可以在课程模型中制作课程? 如何使其自动选择外键字段之一? 学院和教师都可以有职位 class Institute(models.Model): courses = GenericRelation(Course) institute_name = models.OneToOneField(CustomUser,on_delete=models.CASCADE) institute_id = models.Sl

我正在做一个项目场景:
老师可以制作课程并在
课程
模型中发布,学院也可以在
课程
模型中制作课程? 如何使其自动选择
外键
字段之一? 学院和教师都可以有职位

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
然后定义:

如果user.is\u institute中的用户登录
因此,在研究所模型中进行查询

else loggedin in user.is_teacher
然后将研究教师模型。 这个结构好吗

我听说
通用外键
不使用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 

谢谢

我不认为一般关系是你真正需要的

稍微改变一下结构怎么样。让我们将
课程
作为任务的主要模型

比如说

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
之后,您可以检查
课程是否由

如果课程对象是教师:

但是如果你真的想通过学院或老师来区分你的用户,你需要定制用户模型,这里是你的出发点

在这种情况下,在你的
课程
模型中,你只有一个类似
作者=models.ForeignKey(User,related\u name='courses',on\u delete=models.CASCADE)


希望我没有弄错你的问题。

那么,对于这些类型的项目,解决方案是什么?