我是Django的新手,我不知道如何访问主键。我有一个场景,其中有两个用户,老师和学生与抽象用户一对一的关系。在我的情况下,老师创建学生帐户,我已经成功创建了老师帐户,我也想保存由老师注册的学生我知道该怎么做,但是我的问题是我也想将老师保存为注册该特定学生的学生模型,为此,我想获得我可以做到的那个老师对象(当时正在添加学生的老师)。 t,有人可以提供建议或代码怎么做?
Models.py文件:
class User(AbstractUser):
is_student=models.BooleanField(default="False")
is_prof=models.BooleanField(default="False")
class Teacher(models.Model):
user=models.OneToOneField(User,on_delete=models.CASCADE)
designation=models.CharField(max_length=30)
class Student(models.Model):
user=models.OneToOneField(User,on_delete=models.CASCADE)
teacher=models.ForeignKey(Teacher,on_delete=models.CASCADE,default="")
batch=models.CharField(max_length=30)
在我添加学生的方法下面,成功创建了用户,但是在最后一行Student =中要做的事情,因此我可以通过教师ID来反对对象:
obj=User.objects.create_user(
username=myids[iterate],password=passwords[iterate],
is_student=True,is_prof=False)
obj.save()
Student.objects.create(user=obj,teacher=(What to do?),batch="F-14")
答案 0 :(得分:0)
如果您创建的field
是ForeignKey
,则Django会自动创建一个名为field_id
的“孪生字段”,其中存储了id
。 some_object.field
的更新反映在some_object.field_id
中,反之亦然。
因此,您可以在此处改用teacher_id
字段:
obj= User.objects.create_user(
username=myids[iterate],
password=passwords[iterate],
is_student=True,
is_prof=False
)
obj.save()
Student.objects.create(user=obj, teacher_id=myteacherid, batch="F-14")
另一种方法是首先用给定的Teacher
来获取id
对象,然后使用它,但这效率 少,因为它将导致两个查询来构造对象:一个查询来获取Teacher
,一个查询来创建Student
:
obj= User.objects.create_user(
username=myids[iterate],
password=passwords[iterate],
is_student=True,
is_prof=False
)
obj.save()
my_teacher = Teacher.objects.get(pk=myteacherid)
Student.objects.create(user=obj, teacher=myteacher, batch="F-14")
答案 1 :(得分:0)
您可以获取教师对象并将其分配给学生模型中的“教师”字段。
teacher = get_object_or_404(教师,pk = primary_key_of_teacher )
student = Student(用户= user_object 老师= 老师 batch = student_batch )
student.save()