Django Rest框架不显示来自StreamField的内容

Django Rest框架不显示来自StreamField的内容,django,wagtail,django-rest-framework,Django,Wagtail,Django Rest Framework,我在StreamField中有一个ModelChooserBlock模型类,如果打开Django Rest框架,就不会得到令人满意的结果。具体来说,“配料”应该有一个到配料或直接数据库的链接 HTTP 200 OK Allow: GET, HEAD, OPTIONS Content-Type: application/json Vary: Accept { "id": 1, "meta": { "type": "cultinadb.Menu",

我在StreamField中有一个ModelChooserBlock模型类,如果打开Django Rest框架,就不会得到令人满意的结果。具体来说,“配料”应该有一个到配料或直接数据库的链接

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'),
    ]
使用序列化程序,但随后出现错误。 我创建了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_字段

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\u API\u表示法
方法自定义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定义中使用
InCreditChooserBlock('kitchen.component')
代替
ModelChooserBlock('kitchen.component')

它可以工作!!多谢各位@gasman嘿@gasman谢谢你的帮助,实际上你为我做了两次。这段代码工作得很好,但它不能表示StreamField中的数据集,例如我有
component=StreamField([('zutaten',IngredientChooserBlock('kitchen.component'))],null=True,verbose\u name='',blank=True)
并且它在DRF中打印出一个错误,如“StreamValue”类型的
对象不是JSON可序列化的
@khashashin从该错误中,听起来像是在
get_api_表示
响应中的某处返回一个复杂对象,例如返回
value
而不是
value.name
等-DRF只能处理简单的Python类型,如字符串、列表和dict。不过,我需要看完整的代码才能进一步研究——我建议以新问题的形式开始。谢谢@gasman,我创建了一个新主题