【发布时间】:2021-08-14 11:44:57
【问题描述】:
我正在创建一个 API 来拯救班主任。现在 ClassTeacher 模型中的所有字段都是外部字段,所以我在序列化程序中使用了 SlugRelatedField。看起来 SlugRelatedField 不支持像“user__username”这样的属性查找并引发属性错误但是对象仍在保存中。
models.py
class ClassTeacher(models.Model):
teacher = models.ForeignKey(Teacher, on_delete=models.CASCADE)
class_name = models.ForeignKey(Classes, on_delete=models.CASCADE)
school_id = models.ForeignKey(School, on_delete=models.CASCADE)
序列化器.py
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__'
我尝试在 Teacher 模型中添加 @property 来检索用户名并使用 slug_field 中的属性,但这也不起作用。
如何保存对象而不出现错误?
编辑 1:
teachers/models.py
class Teacher(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
name = models.CharField(max_length=30)
photo = models.URLField()
teacher/serializers.py
class TeacherSerializer(ModelSerializer):
class Meta:
model = Teacher
fields = '__all__'
学校/models.py
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()
学校/serializers.py
class SchoolSerializer(ModelSerializer):
class Meta:
model = School
fields = '__all__'
编辑 2:
这是我通过引用here 使用@property 的方式:
teacher/models.py
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
classteacher/serializers.py
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__'
【问题讨论】:
-
请同时提供模型教师实现
-
@Someprogammer 我已经进行了编辑。现在就来看看吧。
-
Hello @AyushGupta DRF 不允许在 SlugRelatedFields 上进行嵌套属性查找
-
@AnkitTiwari 是的,我也想到了,但有什么替代方案?
-
您可以使用@property 获取关系