Django Rest Framework 不显示来自 StreamField 的内容

Django Rest Framework does not show content from StreamField

我有一个模型 class,在 StreamField 中带有 ModelChooserBlock,如果我打开我的 Django Rest Framework,我不会得到令人满意的结果。具体 "Ingredient" 应该有一个 link 到成分或直接数据库。

HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 1,
    "meta": {
        "type": "cultinadb.Menu",
        "detail_url": "http://127.0.0.1:8000/api/v2/menu/1/"
    },
    "title": "",
    "Ingredient": [
        {
            "type": "zutaten",
            "value": 2,
            "id": "647d762f-ec26-4c78-928a-446344b1cb8a"
        },
        {
            "type": "zutaten",
            "value": 1,
            "id": "6ab4e425-5e75-4ec0-ba63-8e7899af95e2"
        }
    ],
}

这是我的模型:

from django.db import models
from wagtail.api import APIField
from wagtailmodelchooser import register_model_chooser
from wagtailmodelchooser.blocks import ModelChooserBlock

@register_model_chooser
class Ingredient(models.Model):
    name = models.CharField(max_length=255)
    picture_url = models.URLField(blank=True)
    translate_url = models.URLField(blank=True)

    def __str__(self):
        return self.name

@register_model_chooser
class Menu(models.Model):
    Ingredient = StreamField([
        ('zutaten', ModelChooserBlock('kitchen.Ingredient')) ],
        null=True, verbose_name='', blank=True)

    panels = [
        MultiFieldPanel(
            [ StreamFieldPanel('Ingredient') ],
            heading="Zutaten", classname="col5"
        ),
    ]

    def __str__(self):
        return self.title

    api_fields = [
        APIField('Ingredient'),
    ]

I tried to add it as shown here 与序列化程序,但后来我得到了错误。 我创建了 serializer.py 并添加了这段代码

class MenuRenditionField(Field):
    def get_attribute(self, instance):
        return instance
    def to_representation(self, menu):
        return OrderedDict([
            ('title', menu.Ingredient.name),
            ('imageurl', menu.Ingredient.picture_url),
            ('imageurl', menu.Ingredient.translate_url),
        ])

然后我把我的api_fields改成这样

api_fields = [
   APIField('Ingredient', serializer=MenuRenditionField()),
]

添加此代码时出现的错误。

AttributeError at /api/v2/menu/1/
'StreamValue' object has no attribute 'name'
   Request Method:  GET
   Request URL: http://127.0.0.1:8000/api/v2/menu/1/
   Django Version:  1.11.1
   Exception Type:  AttributeError
   Exception Value: 
   'StreamValue' object has no attribute 'name'

我将非常感谢您的帮助。谢谢!

您可以通过覆盖 get_api_representation 方法自定义 StreamField 块的 API 输出。在这种情况下,它可能类似于:

class IngredientChooserBlock(ModelChooserBlock):
    def get_api_representation(self, value, context=None):
        if value:
            return {
                'id': value.id,
                'name': value.name,
                # any other relevant fields of your model...
            }

然后在 StreamField 定义中使用 IngredientChooserBlock('kitchen.Ingredient') 代替 ModelChooserBlock('kitchen.Ingredient')