如何创建具有不同用户类型的帖子(一个帖子模型的两个外键)?
Posted
技术标签:
【中文标题】如何创建具有不同用户类型的帖子(一个帖子模型的两个外键)?【英文标题】:how to create post with different user type (two foreign key for one post model)? 【发布时间】:2020-06-21 03:07:07 【问题描述】:我正在做一个项目的场景:teacher
s 可以制作课程并在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)
的字段
希望我的问题是正确的。
【讨论】:
以上是关于如何创建具有不同用户类型的帖子(一个帖子模型的两个外键)?的主要内容,如果未能解决你的问题,请参考以下文章