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)
及其对我的作用