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

Posted

技术标签:

【中文标题】如何创建具有不同用户类型的帖子(一个帖子模型的两个外键)?【英文标题】:how to create post with different user type (two foreign key for one post model)? 【发布时间】:2020-06-21 03:07:07 【问题描述】:

我正在做一个项目的场景:teachers 可以制作课程并在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】:

我认为 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-starting-a-project

在这种情况下,在您的 Course 模型中,您将只有一个类似于 author = models.ForeignKey(User, related_name='courses', on_delete=models.CASCADE) 的字段

希望我的问题是正确的。

【讨论】:

以上是关于如何创建具有不同用户类型的帖子(一个帖子模型的两个外键)?的主要内容,如果未能解决你的问题,请参考以下文章

工厂创建具有不同数量关系的多个模型

如何查询具有不同属性的模型

如何在具有帖子类型的自定义页面上显示所有图像字段

模型工厂与现有模型的关联

在 ejs 中显示帖子的用户名

如何从用户在 django 基本模板中创建的所有帖子中获取模型字段值的总和?