/ / Django Rest Framework n'affiche pas le contenu de StreamField - django, wagtail, django-rest-framework

Django Rest Framework n'affiche pas le contenu de StreamField - django, wagtail, django-rest-framework

J'ai une classe de modèle avec ModelChooserBlockDans StreamField et si j’ouvre mon framework Django Rest, je n’obtiens pas de résultat satisfaisant. En particulier, "Ingrédient" doit avoir un lien vers les ingrédients ou directement dans la base de données.

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"
}
],
}

Voici mon modèle:

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"),
]

J'ai essayé de l'ajouter comme indiqué ici avec sérialiseur, mais alors j'ai eu des erreurs. J'ai créé serializer.py et ajouté ce code

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),
])

Puis j'ai changé mon api_fields comme ça

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

L'erreur que je reçois lors de l'ajout de ce code.

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"

Je serai très reconnaissant pour l'aide. Merci!

Réponses:

3 pour la réponse № 1

Vous pouvez personnaliser la sortie API d’un bloc StreamField en remplaçant le get_api_representation méthode. Dans ce cas, cela pourrait ressembler à quelque chose comme:

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

Puis utilisez IngredientChooserBlock("kitchen.Ingredient") au lieu de ModelChooserBlock("kitchen.Ingredient") dans votre définition StreamField.