4

@gasman 帮助我的上一个主题, 所以我有一个模型类成分,例如:

@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,
            }

然后我有另一个使用类的模型IngredientChooserBlock类:

@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

因为我ingredient在我的 API 中需要这个,所以我创建了相同的模型类来覆盖get_api_representation

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

最后在我的主要模型类中,我尝试使用WeekChooserBlockkitchen.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

在此处输入图像描述


不想提出太大的问题,但为了更清楚起见,我实际上在我的Menu班级中有另一个对象,例如:

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
            }

谢谢你的支持!

4

1 回答 1

2

这里的问题是你{'ingredients': value.ingredient}WeekChooserBlock.get_api_representation. 这value.ingredient是一个 StreamValue 实例,它是一个复杂的 Wagtail 特定对象,包含用于模板渲染的方法以及实际的流数据 - DRF 不知道如何处理这个复杂的对象。

您需要确保您的get_api_representation响应仅包含标准 Python 类型,例如字符串和字典。例如:

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_api_representation

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)
于 2017-08-29T09:28:09.497 回答