我有两种模式:
class Foo(models.Model):
name = models.CharField(max_length=64)
class Bar(models.Model):
foo = models.ForeignKey(Foo)
name = models.CharField(max_length=64)
和那些序列化程序
class FooSerializer(serializers.ModelSerializer):
class Meta:
model = Foo
fields = ('pk', 'name')
class BarSerializer(serializers.ModelSerializer):
foo = ???
class Meta:
model = Bar
fields = ('pk', 'foo', 'name')
我需要为/bar/create
对象创建一个api Bar
,例如:
Foo
主键
Bar
序列化的foo
检索FooSerializer
个对象。所以,我们考虑在db中有这个Foo(pk=1, name='foo')
对象,我想这样做:
{'foo': 1, 'name': 'bar'}
{'foo': {'pk': 1, 'name': 'foo'}, 'name': 'bar'}
我怎么能这么做? 这样做是一种好习惯吗?
答案 0 :(得分:0)
一种方法是将alias字段放入嵌套对象中,并使别名嵌套对象成为只读:
class BarSerializer(serializers.ModelSerializer):
foo_obj = FooSerializer(required=False,read_only=True)
class Meta:
model = Bar
fields = ('pk', 'foo', 'foo_obj', 'name')
如果存在foo
,则会将其置于Bar
的{{1}}字段中。在客户端,您必须保持foo_obj
和foo
同步,这真的很臭。
答案 1 :(得分:0)
class BarSerializer(serializers.ModelSerializer):
class Meta:
model = Bar
fields = ('pk', 'foo', 'name')
class BarNestedSerializer(BarSerializer):
class Meta(BarSerializer.Meta):
depth = 2
class BarView(generics.ListCreateAPIView):
queryset = Bar.objects.all()
def get_serializer_class(self):
return BarNestedSerializer if self.action == 'list' else BarSerializer