DRF Serializer `source` в extra_kwargs

Я получаю странное исключение при попытке сохранить данные через DRF, используя ключ source в extra_kwargs. По сути, я хочу принять данные запроса, используя ключ, отличный от поля модели.

My Models.py

class UserWishlist(models.Model):

    wishlist_id = models.UUIDField(
        primary_key=True,
        default=uuid.uuid4
    )

    name = models.CharField(max_length=255, db_index=True)

    user = models.ForeignKey(
        User, db_index=True, related_name='user_wishlist',
        on_delete=models.CASCADE
    )

class WishlistProducts(models.Model):

    wishlist = models.ForeignKey(
        UserWishlist, db_index=True, on_delete=models.CASCADE
    )  ######## this is the model field that I want to `source` in `extra_kwargs`.

    product_id = models.UUIDField(blank=True, null=True)

    product_url = models.URLField()

    shop = models.ForeignKey(
        Shops, db_index=True, on_delete=models.CASCADE
    ) #### This also. But this works fine.

Мой Serializer.py

class WishlistProductSerializer(serializers.ModelSerializer):
    
    class Meta(object):
        """Meta."""
        model = WishlistProducts
        fields = ('wishlist_id', 'product_id', 'product_url', 'shop_id',
                  'created_at', 'updated_at')
        read_only_fields = ('created_at', 'updated_at')
        extra_kwargs = {
            'shop_id': {'source': 'shop'}, ###### NOT AN ISSUE
            'wishlist_id': {'source': 'wishlist'}, ####### ISSUE
        }

Мой метод действия в views.py

@action(methods=['post'], detail=False)
def add_products(self, request):
    serializer = WishlistProductSerializer(
        data=request.data, context={'request': request}
    )
    serializer.is_valid(raise_exception=True)
    serializer.save()
    return Response(serializer.data, status=201)

Вызов API POST на вышеуказанном представлении/сериализаторе с нижеприведенными данными:

{
  "wishlist_id": "51bb119e-b30a-42e6-ac5b-2608a96aafec",
  "product_id": "3fa85f61-5717-4562-b3fc-2c963f66afa6",
  "product_url": "https://googl1e.com",
  "shop_id": "ffa34976-b82a-469e-b077-83f8962ed34f"
}

При выполнении POST-запроса я получаю KeyError at /wishlist/add_products/ 'wishlist'. Если я удалю source из extra_kwargs для wishlist (и заменю wishlist_id на wishlist в Meta.fields, весь поток работает.

Интересно, что я не получаю KeyError за упоминание shop_id в качестве исходного поля shop.

Что я упускаю?

Это должен был быть комментарий, но у меня недостаточно репутации для этого. Так что, извините.

Но я предполагаю, что проблема заключается в UUID (т.е. PK из UserWishlist). Возможно, именно поэтому DRF не может проследить связь, потому что не генерируется поле id. Вы уже пробовали 'wishlist_id': {'source': 'wishlist.pk'} ?

Просто предположение... Меня тоже смущает эта ошибка.

Вернуться на верх