字段名称 user_username 对模型配置文件无效

Posted

技术标签:

【中文标题】字段名称 user_username 对模型配置文件无效【英文标题】:Field name user_username is not valid for model Profile 【发布时间】:2018-03-11 23:50:30 【问题描述】:

错误名称:字段名称user_username 对模型Profile 无效

我正在构建我的编辑配置文件视图。

这是我的views.py

class ProfileEditAPIView(DestroyModelMixin, UpdateModelMixin, generics.RetrieveAPIView):
    serializer_class = ProfileEditSerializer

    def get_queryset(self):
        logged_in_user = User.objects.filter(username=self.request.user.username)
        return logged_in_user

    def get_object(self):
        queryset = self.get_queryset()
        obj = get_object_or_404(queryset)
        return obj.profile

    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)

我可以正确获取 user_id,但不知何故我无法访问其用户名字段

这是serializers.py

class ProfileEditSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = (
            'user_username', <<<
            'title',
            'gender',
            'birth',
            'height',
            'height_in_ft',
            'profile_img',
        )

models.py

class Profile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL)
    title = models.TextField(max_length=155, blank=True)
    gender = models.CharField(max_length=10, choices=GENDER_CHOICES, default='u') # Recommend Factor
    location = models.CharField(max_length=40, choices=LOCATION_CHOICES, default='ud') # Recommend Factor
    birth = models.DateField(default='1992-07-23', blank=True, null=True) # Recommend Factor
    height = models.CharField(max_length=5, default='undefined')
    height_in_ft = models.BooleanField(default=True)
    profile_img = models.ImageField(
        upload_to=upload_location,
        null=True,
        blank=True)

为什么我们不能访问用户的用户名?我们如何解决这个问题?

谢谢

【问题讨论】:

你能展示你的个人资料模型吗? @MD.KhairulBasar 刚刚编辑了这个问题。谢谢指出 不应该 user_usernameuser__username 吗?双下划线? 我也遇到了同样的错误。字段名称user__username 对模型Profile 无效。 很奇怪。不是吗? 【参考方案1】:

您可以使用这种方式从User模型中获取username

class ProfileEditSerializer(serializers.ModelSerializer):
    username = serializers.CharField(read_only=True, source="user.username")

    class Meta:
        model = Profile
        fields = (
            'username',
            'title',
            . . . .
        )

【讨论】:

几乎..!!因为它是 read_only 你的答案不计入这个问题。如果你检查我的views.py,它有UpdateModelMixin。对不起 @JohnBaek,理想情况下,您不应该提供更改用户名的选项。但如果你想改变,那么只需 remove read_only=True.【参考方案2】:

尝试像在模型中查看的方式调用用户名,即用户。

变化:

        fields = (
        'user_username', <<<
        'title',
        'gender',
        'birth',
        'height',
        'height_in_ft',
        'profile_img',
    )

收件人:

        fields = (
        'user', 
        'title',
        'gender',
        'birth',
        'height',
        'height_in_ft',
        'profile_img',
    )

但如果您希望它在您的 json 响应中显示为用户名,请使用:

class ProfileEditSerializer(serializers.ModelSerializer):
   username = serializers.CharField(source='user')


class Meta:
    model = Profile
    fields = (
        'username', <<<
        'title',
        'gender',
        'birth',
        'height',
        'height_in_ft',
        'profile_img',
    )

【讨论】:

以上是关于字段名称 user_username 对模型配置文件无效的主要内容,如果未能解决你的问题,请参考以下文章

Sequelize - 将字段映射到模型定义中的字段别名

一 Django模型层简介

通过名称属性获取文本区域

django - 根据翻译后的名称在管理 ui 中对模型进行排序

雄辩的模型多对一关系

代码优先Add-Migration仅选择对现有模型的更改而不是新模型