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'}
?
Просто предположение... Меня тоже смущает эта ошибка.