【问题标题】: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 

谢谢

【问题讨论】:

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

标签: python django database django-rest-framework foreign-keys


【解决方案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) 的字段

希望我的问题是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 2012-04-28
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    相关资源
    最近更新 更多