【问题标题】:when updating serializer, nested serilizers does not have instance (many = true)更新序列化程序时,嵌套的序列化程序没有实例(许多 = true)
【发布时间】:2015-03-12 13:58:57
【问题描述】:

我有 UserSerializer 和嵌套的 UserClientSerializer。我正在尝试更新登录用户的信息。但我收到 unique_together 验证错误。

我有以下型号: models.py

class UserClients(models.Model):
    user = models.ForeignKey(User, related_name='user_clients')
    client = models.ForeignKey(Client, related_name='client_users')
    belongs_to = models.BooleanField(default=False)
    for_future = models.BooleanField(default=False)

    class Meta:
        unique_together = ('user', 'client')

我还有两个序列化器。 serializers.py

class UserClientsSerializer(serializers.ModelSerializer):

    class Meta:
        model = UserClients

class UserSerializer(serializers.ModelSerializer):
    user_clients = UserClientsSerializer(required=False, allow_null=True, many=True)
    class Meta:
        model = get_user_model()
        exclude = ('password','username', 'date_joined', 'is_superuser')
    @transaction.atomic
    def create(self, validated_data):
    ...
    @transaction.atomic
    def update(self, instance, validated_data):
    ...

views.py

class CurrentUserDetails(RetrieveUpdateAPIView):

    serializer_class = UserSerializer
    permission_classes = (IsAuthenticated,)

    def get_object(self):
        return self.request.user

所以,当我尝试更新我的用户数据时,例如“belongs_to”为 False,我想将其更改为 False。 我的我的JSON数据是这样的。

{
"user_clients": [
    {
        "id": 57, 
        "belongs_to": true, 
        "for_future": false, 
        "user": 25, 
        "client": 3
    }
]
}

但我收到这样的验证错误

{
    "user_clients": [
        {
            "non_field_errors": [
                "The fields user, client must make a unique set."
            ]
        }
    ]
}

你对这个问题有什么想法吗?

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    此链接上的第二个帖子似乎描述了一个类似的问题和一个应该适合您的潜在解决方法:

    https://github.com/tomchristie/django-rest-framework/issues/2380

    您似乎是在尝试创建一个新对象而不是更新旧对象,这就是为什么您会遇到 unique together 错误的原因。

    如果不是这种情况,请尝试关闭验证并按照上述链接中的说明使用您自己的验证。

    【讨论】:

    • 是的,我似乎正在尝试创建新对象,但我想更新它。
    • 嗯,尝试在 many=True 不记得之后添加 partial=True,但可能就是这样。
    • @Felix 你能找到一个更简单的解决方案吗?很抱歉挖了一个很老的帖子。
    猜你喜欢
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 2018-11-12
    • 1970-01-01
    • 2022-12-12
    • 2015-03-31
    相关资源
    最近更新 更多