Django REST: поиск сериализатора по UUID - PullRequest
0 голосов
/ 26 сентября 2018

Я создаю этот простой API покупок в Django REST.

Внутренне я использую идентификаторы для ограничений внешнего ключа, в то время как guuids переносятся во внешний мир.

Для процедуры оформления заказа пользователь предоставляет список идентификаторов товаров, которые он готов приобрести.Таким образом, объект в данных POST выглядит следующим образом:

{
  assets: [
    {
       'product': 'd9d5044d-2284-4d15-aa76-2eee3675035b',
       'amount': 4
    },
    ....
  ]
}

Я использую следующие модели билетов / активов:

# Ticket
class Ticket(models.Model):
    uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
    owner = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='tickets', on_delete=models.CASCADE)


# Assets
class Asset(models.Model):
    ticket = models.ForeignKey(Ticket, related_name='assets', on_delete=models.CASCADE)
    stock_item = models.ForeignKey(Stock, related_name='stock_item', on_delete=models.SET_NULL, null=True)
    amount = models.IntegerField(validators=[MinValueValidator(0)])

И сериализаторы выглядят следующим образом:

# Asset serializer
class AssetSerializer(serializers.ModelSerializer):

    class Meta:
        model = Asset
        fields = ('stock_item', 'amount')


# Ticket serializer
class TicketSerializer(WritableNestedModelSerializer):
    owner = serializers.ReadOnlyField(source='owner.username')
    assets = AssetSerializer(many=True)

    class Meta:
        model = Ticket
        fields = ('uuid', 'owner', 'assets', )

    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)

При публикации объекта указанного выше типа появляется следующая ошибка:

{"assets":[{"stock_item": ["Invalid type. Expected PK, received string"]}]}

Что я не могу решить, как я могу указать сериализатору использовать uuid как значение поиска?Я решил аналогичную проблему на уровне представления ранее с помощью члена lookup_field, но это, похоже, не решило ее.Есть предложения?
Введите код

1 Ответ

0 голосов
/ 26 сентября 2018

Если я вас правильно понял, SlugRelatedField сможет найти правильный связанный объект.

class AssetSerializer(serializers.ModelSerializer):
    ticket = serializers.SlugRelatedField(
        read_only=True,
        slug_field='uuid',
        queryset=Ticket.objects.all() # Might be redundant with read_only=True
    )

    class Meta:
        model = Asset
        fields = ('ticket', 'stock_item', 'amount')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...