Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在没有原始sql的情况下支持Django中的用户多态性?_Django - Fatal编程技术网

如何在没有原始sql的情况下支持Django中的用户多态性?

如何在没有原始sql的情况下支持Django中的用户多态性?,django,Django,字幕:当学生成为老师时 想象两个类,学生和教师,每个都从用户继承。这些模型都不是抽象的。如何修改student的实例,使其也可以是教师,而不必插入原始sql和插入教师记录 user = User.objects.get(whatever_id) student = Student.objects.create(user=user) teacher = Teacher.objects.create(user=user) 在这里,同一个用户在学生对象和教师对象中有一个实例。 但正如评论中所指出的,

字幕:当学生成为老师时

想象两个类,学生和教师,每个都从用户继承。这些模型都不是抽象的。如何修改student的实例,使其也可以是教师,而不必插入原始sql和插入教师记录

user = User.objects.get(whatever_id)
student = Student.objects.create(user=user)
teacher = Teacher.objects.create(user=user)
在这里,同一个用户在学生对象和教师对象中有一个实例。 但正如评论中所指出的,学生实例不能是教师实例。那是不可能的。这与django无关

在这里,同一个用户在学生对象和教师对象中有一个实例。
但正如评论中所指出的,学生实例不能是教师实例。那是不可能的。这与django无关。

首先,你必须考虑你的设计。不是指Django,而是指一般情况

如果有用户类、学生类和教师类,则可以创建用户、学生和教师的实例。不能创建既是学生又是教师的实例,除非创建继承自学生和教师的第四类学生教师。这是多重继承的一个特例,称为菱形继承,很少是一个好主意

Django确实支持其模型的继承。如果B从A继承,而A没有声明为抽象到Django,那么Django将为A创建一个表,为B创建一个表,并使用A的外键,如果您访问B的实例,它将连接表B和A

但我不认为Django支持多模型继承,这在这里是需要的。即使这样,它也会把你带入痛苦的世界

我认为,解决办法是。您创建的不是用户、学生、教师和学生教师,而是用户、学生角色和教师角色

然后,您可以将用户组合为学生角色或教师角色,或两者兼而有之。用户具有教师角色或学生角色

在Django中,您可以使用

class User(Model):
    name = CharField()

class StudentRole(Model):
     user = OneToOneField(User, related_name='student_role')
     average_grade = FloatField()

class TeacherRole(Model):
     user = OneToOneField(User, related_name='teacher_role')
     age = IntegerField()
`然后创建如下对象:

user = User()
user.save()
student_role = StudentRole(user=user)
student_role.save()
teacher_role = TeacherRole(user=user)
teacher_role.save()
user.student_role.average_grade = 4
user.save()
当然,您也可以使用StudentRole.objects.create等

您可以像这样使用对象:

user = User()
user.save()
student_role = StudentRole(user=user)
student_role.save()
teacher_role = TeacherRole(user=user)
teacher_role.save()
user.student_role.average_grade = 4
user.save()

首先,你必须考虑你的设计。不是指Django,而是指一般情况

如果有用户类、学生类和教师类,则可以创建用户、学生和教师的实例。不能创建既是学生又是教师的实例,除非创建继承自学生和教师的第四类学生教师。这是多重继承的一个特例,称为菱形继承,很少是一个好主意

Django确实支持其模型的继承。如果B从A继承,而A没有声明为抽象到Django,那么Django将为A创建一个表,为B创建一个表,并使用A的外键,如果您访问B的实例,它将连接表B和A

但我不认为Django支持多模型继承,这在这里是需要的。即使这样,它也会把你带入痛苦的世界

我认为,解决办法是。您创建的不是用户、学生、教师和学生教师,而是用户、学生角色和教师角色

然后,您可以将用户组合为学生角色或教师角色,或两者兼而有之。用户具有教师角色或学生角色

在Django中,您可以使用

class User(Model):
    name = CharField()

class StudentRole(Model):
     user = OneToOneField(User, related_name='student_role')
     average_grade = FloatField()

class TeacherRole(Model):
     user = OneToOneField(User, related_name='teacher_role')
     age = IntegerField()
`然后创建如下对象:

user = User()
user.save()
student_role = StudentRole(user=user)
student_role.save()
teacher_role = TeacherRole(user=user)
teacher_role.save()
user.student_role.average_grade = 4
user.save()
当然,您也可以使用StudentRole.objects.create等

您可以像这样使用对象:

user = User()
user.save()
student_role = StudentRole(user=user)
student_role.save()
teacher_role = TeacherRole(user=user)
teacher_role.save()
user.student_role.average_grade = 4
user.save()

我不明白你想做什么。您不能同时拥有StudentInstance和teacher的实例。这两个类有一个共同的祖先,但它们并不相互继承。您是否可以尝试再次解释您试图实现的目标/您是否可以为个人登录设置用户,然后如果将他们创建为学生,也可以创建相关的学生记录,同样针对教师。如果你想两者兼而有之,只需为同一个用户创建另一个。“更难的部分可能是应用程序中的上下文管理。”康斯坦丁·舒伯特(KonstantinSchubert)想一想一个也教过一些课程的研究生。这是我试图实现的一个示例:一个既是学生又是教师的用户。@skywater在这种情况下,继承不适合您。因为一个对象只能是一种类型,而不是两种类型。但是,您需要从用户中自由添加或删除student属性和teacher属性的选项。你可能应该选择一种更倾向于组合而不是继承的模式。我不明白你想做什么。您不能同时拥有StudentInstance和teacher的实例。这两个类有一个共同的祖先,但它们并不相互继承。你能再次解释一下你想要实现的目标吗/你能让一个人登录一个用户吗,如果你是学生,那么也要创建相关的Stu
dent记录,同样适用于教师。如果你想两者兼而有之,只需为同一个用户创建另一个。“更难的部分可能是应用程序中的上下文管理。”康斯坦丁·舒伯特(KonstantinSchubert)想一想一个也教过一些课程的研究生。这是我试图实现的一个示例:一个既是学生又是教师的用户。@skywater在这种情况下,继承不适合您。因为一个对象只能是一种类型,而不是两种类型。但是,您需要从用户中自由添加或删除student属性和teacher属性的选项。您可能应该选择一种有利于组合而非继承的模式。第三行将抛出IntegrityError。但是,如果您将其替换为原始sql,该sql创建了user_ptr_id=user.id的教师记录,那么您将得到一个学生和教师,他们共享相同的id,和user.student和user.teacher都是各自类的良好实例。在问题中发布您的模型。我怀疑发生完整性错误是因为继承隐式地在学生和用户以及教师和用户之间创建了一对一的关系。因此,它不允许两个不同的对象student和teacher引用同一个用户。第三行将抛出IntegrityError。但是,如果您将其替换为原始sql,该sql创建了user_ptr_id=user.id的教师记录,那么您将得到一个学生和教师,他们共享相同的id,和user.student和user.teacher都是各自类的良好实例。在问题中发布您的模型。我怀疑发生完整性错误是因为继承隐式地在学生和用户以及教师和用户之间创建了一对一的关系。因此,它不允许两个不同的对象student和teacher引用同一个用户。