0

我已成功用于SlugRelatedField验证与create. 但是,当 I 时use update,它无法正确验证。

假设我有:

#models.py
class Product(models.Model):
    name = models.CharField()
    amount = models.IntegerField()
    description = models.TextField()

    def __str__(self):
        return "{} XL".format(self.name)

class Query(models.Model):
    name = models.CharField()
    product = models.ForeignKey(Product)
    ...

#serializers.py
class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = '__all__'

class QuerySerializer(serializers.ModelSerializer):
    product = serializers.SLugRelatedField(slug_field='name', queryset=Product.objects.all())

    class Meta:
        model = Query
        fields = '__all__'

    def create(self, validated_data):
        product = validated_data.pop('product').name
        ...

    def update(self, instance, validated_data):
        instance.product = validated_data.get('product', instance.product)
        ...

当我发布时,它会成功:

{
    "name": "Query 1",
    "product": "Pants",
    ...
}

但是当我修补时,它会出现问题并得到响应错误。我知道__str__模型中的 使事情复杂化。但是我想在不删除它的情况下解决它。

{
    ...
    "product": "Shirt",
    ...
}

响应错误:

{'product': ['Object with name=Shirt XL does not exist.']}

如何在更新时捕获验证?我尝试添加validate以打印数据。但是为什么更新时不打印?

def validate(self, data):
    print(data)    # Does not print on update
    return data

update有没有办法product = product.name像我一样改变它create

4

1 回答 1

0

通常 slug 字段必须是唯一的,因此设置一个标志unique=True ,当SlugRelatedField用作读写字段时,您通常需要确保 slug 字段对应于模型字段,该字段unique=True必须是某种类型pkuuid对象。

您也可以生成自己的 slug 并使用它

def generate_slug(n=7):
    return ''.join(string.ascii_uppercase + string.digits) for _ in range(n))
于 2020-02-18T06:57:39.960 回答