Решение :
class FooSerializer(serializers.ModelSerializer):
class Meta:
model = models.Foo
fields = ('id', 'code')
class BarSerializer(serializers.ModelSerializer):
foo = FooSerializer(models.Foo.objects.all(), read_only=True)
foo_id = serializers.PrimaryKeyRelatedField(
source='foo',
queryset=models.Foo.objects.all(),
write_only=True
)
class Meta:
model = models.Bar
fields = ('id', 'foo', 'foo_id', 'description')
Используйте вложенный сериализатор как read_only
, чтобы получить полный Foo
объект.
Используйте поле write_only
foo_id
дляиспользовать его для создания / обновления.
Теперь ваши данные запроса будут выглядеть следующим образом:
{ 'foo_id': 1, 'description': 'foo bar' }
В качестве альтернативы, если вам не нужны два поля, одно для чтения, а другое для записи, вы можете переопределитьcreate
/ update
методы сериализатора для захвата идентификатора foo
.
Пример :
class BarSerializer(serializers.ModelSerializer):
foo = FooSerializer(Foo.objects.all())
class Meta:
model = models.Bar
fields = ('id', 'foo', 'description')
def create(self, validated_data):
foo = validated_data.pop('foo')
bar = Bar.objects.create(
foo=foo.id,
**validated_data
)
return bar
def update(self, instance, validated_data):
foo = validated_data.pop('foo')
instance.foo = foo
instance.update(
**validated_data
)
return instance
Данные запроса, вв этом случае будет:
{ 'foo': {'id': '1', 'code': 'AAA'}, 'description': 'foo bar' }