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')
。
我有一个模型 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')
。