Python 通过SlugRelatedField获取AttributeError,尽管对象已保存
我正在创建一个API来拯救班主任。现在ClassTeacher模型中的所有字段都是外部字段,所以我在序列化程序中使用了一个SlugRelatedField。看起来SlugRelatedField不支持像“用户\用户名”这样的属性查找,并引发属性错误,但仍在保存对象 models.py 序列化程序.py teacher/serializers.py 学校/models.py school/serializers.py 编辑2: 下面是我如何通过引用以下内容来使用Python 通过SlugRelatedField获取AttributeError,尽管对象已保存,python,django,Python,Django,我正在创建一个API来拯救班主任。现在ClassTeacher模型中的所有字段都是外部字段,所以我在序列化程序中使用了一个SlugRelatedField。看起来SlugRelatedField不支持像“用户\用户名”这样的属性查找,并引发属性错误,但仍在保存对象 models.py 序列化程序.py teacher/serializers.py 学校/models.py school/serializers.py 编辑2: 下面是我如何通过引用以下内容来使用@属性: 教师/模特.py clas
@属性
:
教师/模特.py
classteacher/serializers.py
例如,您可以使用
@property
class User(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
name = models.CharField(max_length=30)
photo = models.URLField()
@property
def get_username(self):
return Teacher.objects.filter(user_id=self.id)
而不是在ClassTeacherSerializer
中使用slug\u field='username'
让我知道它是否有效。尝试将序列化器字段从教师重命名为用户,并使用slug\u field='username'请提供教师模型实现also@Someprogammer我已经做了编辑。现在看看。Hello@AyushGupta DRF不允许在SlugRelatedFields@AnkitTiwari是的,我也这么认为,但还有什么选择呢?你可以使用@property来获取关系。请详细说明,因为教师模型中的序列化器字段已经命名为user??我将包括教师和学校的序列化程序。将字段名从ClassTeacherSerializer.teacher更改为ClassTeacherSerializer.user,应该可以工作;如果您想将teacher添加为直接字段,我会尝试在get_queryset()view方法中对其进行.annotation()注释,或者编写一个自定义的ClassTeacherField(请参见)。问题很可能是,它试图在名为“teacher”的模型中找到一个关系,但找不到,因为模型中没有这样的字段,只有“user”。另一个解决方案是将模型中的“用户”更改为“教师”。在我看来,最好的
class ClassTeacherSerializer(ModelSerializer):
teacher = SlugRelatedField(slug_field='user__username', queryset=Teacher.objects.all()) <---- this is causing the error
class_name = SlugRelatedField(slug_field='class_name', queryset=Classes.objects.all())
school_id = SlugRelatedField(slug_field='school_id__username', queryset=School.objects.all()) <---- and I am assuming that this will too
class Meta:
model = ClassTeacher
fields = '__all__'
class Teacher(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
name = models.CharField(max_length=30)
photo = models.URLField()
class TeacherSerializer(ModelSerializer):
class Meta:
model = Teacher
fields = '__all__'
class School(models.Model):
school_id = models.OneToOneField(User, on_delete=models.CASCADE)
principal = models.CharField(max_length=50)
name = models.CharField(max_length=50)
photo = models.URLField()
class SchoolSerializer(ModelSerializer):
class Meta:
model = School
fields = '__all__'
class Teacher(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
name = models.CharField(max_length=30)
photo = models.URLField()
#Here's the extra property part
@property
def username(self):
return self.user.username
class ClassTeacherSerializer(ModelSerializer):
#Here I changed user__username to just username as mentioned in the above link
teacher = SlugRelatedField(slug_field='username', queryset=Teacher.objects.all())
class_name = SlugRelatedField(slug_field='class_name', queryset=Classes.objects.all())
school_id = SlugRelatedField(slug_field='school_id__username', queryset=School.objects.all())
class Meta:
model = ClassTeacher
fields = '__all__'
class User(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
name = models.CharField(max_length=30)
photo = models.URLField()
@property
def get_username(self):
return Teacher.objects.filter(user_id=self.id)