gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:03:14 25 4
gpt4 key购买 nike

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

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 block 的 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')

关于Django Rest Framework 不显示来自 StreamField 的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45843298/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com