Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.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
Python 通过SlugRelatedField获取AttributeError,尽管对象已保存_Python_Django - Fatal编程技术网

Python 通过SlugRelatedField获取AttributeError,尽管对象已保存

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

我正在创建一个API来拯救班主任。现在ClassTeacher模型中的所有字段都是外部字段,所以我在序列化程序中使用了一个SlugRelatedField。看起来SlugRelatedField不支持像“用户\用户名”这样的属性查找,并引发属性错误,但仍在保存对象

models.py

序列化程序.py

teacher/serializers.py

学校/models.py

school/serializers.py

编辑2:

下面是我如何通过引用以下内容来使用
@属性

教师/模特.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)