class Channel(models.Model):
name = models.CharField(max_length=20)
class Product(models.Model):
channel = models.Foreignkey(Channel, on_delete=models.PROTECT)
id | name
-------------
1 | Channel1
2 | Channel2
3 | Channel3
4 | Channel4
Для создания Product
объектов мы просто отправляем id
объекта Channel
, и сериализатор сможет получить указанный объект. У меня есть сервис, который предоставляет конечную точку, и клиент просто отправляет запросы на создание объектов. Клиент не знает о channel ids
, он знает только имена каналов.
В этой ситуации возможно ли иметь сериализатор, где клиент все еще может отправлять имена каналов в запросе, но в базе данных они получают правильные ссылки на внешние ключи при создании Product
obj? Может ли кто-нибудь указать мне какие-либо примеры или документацию, чтобы справиться с этим?
Редактировать Если бы я должен был указать id
в моем запросе на публикацию, представления и сериализаторы будут выглядеть следующим образом:
class ProductsViewSet(viewsets.ModelViewSet):
queryset = models.Product.objects.all()
serializer_class = serializers.ProductSerializer
class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = models.Product
fields = "__all__"
, и тело запроса будет иметь вид,
{
"channel": 1
}
Но я хочу отправить запрос, как показано ниже, но все же смогу использовать вышеуказанный сериализатор с небольшими изменениями,
{
"channel": "Channel1"
}
Далее Редактировать У меня работает ответ от Саши. Я должен был предоставить один дополнительный аргумент queryset
, полный сериализатор показан ниже,
class ProductSerializer(serializers.ModelSerializer):
channel = serializers.SlugRelatedField(
many=False,
read_only=False,
slug_field='name',
queryset=models.Channel.objects.all()
)
class Meta:
model = models.Product
fields = "__all__"
Если вы хотите создать объекты ссылочной модели (если она не существует), тогда мы должны будем расширить SlugRelatedField
, так как он не может создавать объекты по умолчанию. Ниже я нашел пример, который
Создание и сохранение объектов внешнего ключа с использованием SlugRelatedField