我有看起来像这样的模型:
class Category(models.Model): parentCategory = models.ForeignKey('self', blank=True, null=True, related_name='subcategories') name = models.CharField(max_length=200) description = models.CharField(max_length=500)
我设法通过序列化器获得了所有类别的平面json表示形式:
class CategorySerializer(serializers.HyperlinkedModelSerializer): parentCategory = serializers.PrimaryKeyRelatedField() subcategories = serializers.ManyRelatedField() class Meta: model = Category fields = ('parentCategory', 'name', 'description', 'subcategories')
现在,我要做的是让子类别列表具有子类别的内联json表示形式而不是其ID。django-rest-framework我该怎么做?我试图在文档中找到它,但它似乎不完整。
而不是使用ManyRelatedField,请使用嵌套的序列化程序作为字段:
class SubCategorySerializer(serializers.ModelSerializer): class Meta: model = Category fields = ('name', 'description') class CategorySerializer(serializers.ModelSerializer): parentCategory = serializers.PrimaryKeyRelatedField() subcategories = serializers.SubCategorySerializer() class Meta: model = Category fields = ('parentCategory', 'name', 'description', 'subcategories')
如果要处理任意嵌套的字段,则应查看自定义文档的默认字段部分。你目前无法直接将序列化器声明为自身的字段,但是可以使用这些方法来覆盖默认情况下使用的字段。
class CategorySerializer(serializers.ModelSerializer): parentCategory = serializers.PrimaryKeyRelatedField() class Meta: model = Category fields = ('parentCategory', 'name', 'description', 'subcategories') def get_related_field(self, model_field): # Handles initializing the `subcategories` field return CategorySerializer()
实际上,正如你所指出的,上述内容并不完全正确。这有点骇人听闻,但你可以尝试在声明序列化程序之后添加字段。
class CategorySerializer(serializers.ModelSerializer): parentCategory = serializers.PrimaryKeyRelatedField() class Meta: model = Category fields = ('parentCategory', 'name', 'description', 'subcategories') CategorySerializer.base_fields['subcategories'] = CategorySerializer()
声明递归关系的机制是需要添加的。