Неправильная проверка Rest Framework при обновлении с использованием SlugRelatedField - PullRequest
0 голосов
/ 18 февраля 2020

Я успешно использовал SlugRelatedField для проверки связи с другой моделью в create. Однако, когда я 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)
        ...

Когда я POST, он становится успешным:

{
    "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?

1 Ответ

0 голосов
/ 18 февраля 2020

обычно поле слагов должно быть уникальным, поэтому установите флаг unique=True. При использовании SlugRelatedField в качестве поля для чтения и записи обычно требуется убедиться, что поле слагов соответствует полю модели с unique=True либо должен быть чем-то вроде pk или uuid объекта.

Также вы можете создать свой собственный слаг и использовать его

def generate_slug(n=7):
    return ''.join(string.ascii_uppercase + string.digits) for _ in range(n))
...