Django 将类对象转换为get_api_表示函数的可读值

Django 将类对象转换为get_api_表示函数的可读值,django,wagtail,django-rest-framework,wagtail-streamfield,Django,Wagtail,Django Rest Framework,Wagtail Streamfield,因此,我有一个模型类,如: @register_model_chooser class Ingredient(models.Model): name = models.CharField(max_length=255) def __str__(self): return self.name 为了在API中表示这一点,我创建了这个类: class IngredientChooserBlock(ModelChooserBlock): def get_api_

因此,我有一个模型类,如:

@register_model_chooser
class Ingredient(models.Model):
    name = models.CharField(max_length=255)
    def __str__(self):
        return self.name
为了在API中表示这一点,我创建了这个类:

class IngredientChooserBlock(ModelChooserBlock):
    def get_api_representation(self, value, context=None):
        if value:
            return {
                'name': value.name,
            }
然后,我有另一个模型类,它使用
IngreditChooserBlock
类:

@register_model_chooser
class Menu(models.Model):
    ingredient = StreamField([
        ('zutaten', IngredientChooserBlock('kitchen.Ingredient')) ],
        null=True, verbose_name='', blank=True)
        def __str__(self):
            return self.title
因为我在API中需要这个
成分
,所以我创建了相同的模型类来覆盖
get\u API\u表示

class WeekChooserBlock(ModelChooserBlock):
    def get_api_representation(self, value, context=None):
        if value:
            return {
                'ingredients': value.ingredient,
            }
最后,在我的主要模型类中,我尝试使用这个
WeekChooserBlock
,它以
kitchen.Menu
作为参数,如下所示:

class Week(models.Model):
    dishes_sp = StreamField([
        ('menu', WeekChooserBlock('kitchen.Menu')) ],
        null=True, verbose_name='', blank=True)
问题是它在DRF中打印出一个错误,如下所示:

Object of type 'StreamValue' is not JSON serializable


我不想提出太大的问题,但为了更清楚,我实际上在我的
菜单中有另一个对象,如:

class Menu(models.Model):
    title = models.CharField(max_length=255)
    image = models.URLField(blank=True, null=True)
    price = models.FloatField(blank=True, null=True, max_length=255)
    ingredient = StreamField([
        ('zutaten', IngredientChooserBlock('kitchen.Ingredient')) ],
        null=True, verbose_name='', blank=True)
    steps = StreamField([
        ('Schritt', TextBlock())
        ], null=True, verbose_name='Vorbereitungsschritte', blank=True)
我也在努力代表他们。但仅当我试图输出
StreamField

class WeekChooserBlock(ModelChooserBlock):
    def get_api_representation(self, value, context=None):
        if value:
            return {
                'title': value.title,
                'picture': value.image,
                'price': value.price,
                'ingredients': value.ingredient,
                'steps': value.steps
            }

谢谢你的支持

这里的问题是,您正在从
WeekChooserBlock.get\u api\u表示返回
{'components':value.component}
。这里的
value.component
是一个StreamValue实例,它是一个复杂的特定于Wagtail的对象,包含用于模板呈现的方法以及实际的流数据-DRF不知道如何处理这个复杂对象

您需要确保您的
get\u api\u表示
响应只包含标准Python类型,例如字符串和dict。例如:

class WeekChooserBlock(ModelChooserBlock):
    def get_api_representation(self, value, context=None):
        if value:
            return {
                'ingredients': [ingredient.value['name'] for ingredient in value.ingredient],
            }
如果要对在
IngredientChooserBlock.get\u API\u representation
中定义的成分重新使用API表示法,这会有点麻烦,但您应该能够通过以下方法实现:

class WeekChooserBlock(ModelChooserBlock):
    def get_api_representation(self, value, context=None):
        if value:
            ingredient = value.ingredient
            return ingredient.stream_block.get_api_representation(ingredient, context=context)

我尝试使用您提供的代码,但仍然产生错误。您忘记在
之间插入模型类对象。stream\u block
会出现错误:
返回值。stream\u block.get\u api\u表示(值,上下文=上下文)
或:
返回值。配料。stream\u block.get\u api\u表示(值,上下文=上下文)
--
'Menu'对象是不可编辑的
如果我试图在没有
成分的情况下返回它,我得到了:
'Menu'对象没有属性“stream\u block”
因此对于其他用户,我尝试了技巧的第二部分
类WeekChooserBlock(ModelChooserBlock):def get\u api表示(self,value,context=None):if-value:component=value.component-return-component.stream\u-block.get\u-api\u表示法(component,context=context)
及其对我的作用