/ / Django Rest FrameworkはStreamFieldのコンテンツを表示しません - django、wagtail、django-rest-framework

Django Rest FrameworkはStreamFieldのコンテンツを表示しません - django、wagtail、django-rest-framework

私はModelChooserBlockでモデルクラスを持っていますStreamFieldの内側にあり、私がDjango Rest Frameworkを開いた場合、満足のいく結果が得られません。具体的には、「Ingredient」には、成分へのリンクやデータベースへのリンクが必要です。

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_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"

私は助けに非常に感謝します。ありがとう!

回答:

回答№1の場合は3

StreamFieldブロックのAPI出力をカスタマイズするには、 get_api_representation 方法。この場合、次のようになります。

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...
}

それから、 IngredientChooserBlock("kitchen.Ingredient") 代わりに ModelChooserBlock("kitchen.Ingredient") あなたのStreamField定義で。