str poo multiple metodos metodo herencia español __str__ __init__ django wagtail django-rest-framework wagtail-streamfield

django - poo - metodos en python



Conversión de objeto de clase a valor legible para la función get_api_representation (1)

El problema aquí es que estás devolviendo {''ingredients'': value.ingredient} de WeekChooserBlock.get_api_representation . Aquí value.ingredient es una instancia de StreamValue, que es un objeto complejo específico de Wagtail que contiene métodos para la representación de la plantilla, así como los datos de la transmisión real: DRF no sabe cómo manejar este objeto complejo.

get_api_representation asegurarse de que su respuesta get_api_representation solo consta de tipos de Python estándar, como cadenas y dicts. Por ejemplo:

class WeekChooserBlock(ModelChooserBlock): def get_api_representation(self, value, context=None): if value: return { ''ingredients'': [ingredient.value[''name''] for ingredient in value.ingredient], }

Si desea volver a utilizar la representación de API para Ingredient que definió en IngredientChooserBlock.get_api_representation , se vuelve un poco complicado, pero debe poder hacer esto con:

class WeekChooserBlock(ModelChooserBlock): def get_api_representation(self, value, context=None): if value: ingredient = value.ingredient return ingredient.stream_block.get_api_representation(ingredient, context=context)

Tema anterior donde @gasman me ayudó amablemente, así que tengo una clase de ingredientes de clase como:

@register_model_chooser class Ingredient(models.Model): name = models.CharField(max_length=255) def __str__(self): return self.name

y para representar esto en API creé esta clase:

class IngredientChooserBlock(ModelChooserBlock): def get_api_representation(self, value, context=None): if value: return { ''name'': value.name, }

entonces tengo otra clase de modelo que usa la clase IngredientChooserBlock :

@register_model_chooser class Menu(models.Model): ingredient = StreamField([ (''zutaten'', IngredientChooserBlock(''kitchen.Ingredient'')) ], null=True, verbose_name='''', blank=True) def __str__(self): return self.title

y porque necesito este ingredient en mi API, creé la misma clase de modelo para sobrescribir get_api_representation :

class WeekChooserBlock(ModelChooserBlock): def get_api_representation(self, value, context=None): if value: return { ''ingredients'': value.ingredient, }

y al final en mi clase de modelo principal estoy tratando de usar este WeekChooserBlock que toma kitchen.Menu como argumento como tal:

class Week(models.Model): dishes_sp = StreamField([ (''menu'', WeekChooserBlock(''kitchen.Menu'')) ], null=True, verbose_name='''', blank=True)

El problema es que imprime un error en DRF como este:

Object of type ''StreamValue'' is not JSON serializable

No quería crear una pregunta demasiado grande, pero para mayor claridad tengo otros objetos en mi clase de Menu como:

class Menu(models.Model): title = models.CharField(max_length=255) image = models.URLField(blank=True, null=True) price = models.FloatField(blank=True, null=True, max_length=255) ingredient = StreamField([ (''zutaten'', IngredientChooserBlock(''kitchen.Ingredient'')) ], null=True, verbose_name='''', blank=True) steps = StreamField([ (''Schritt'', TextBlock()) ], null=True, verbose_name=''Vorbereitungsschritte'', blank=True)

y también estoy tratando de representarlos también. Pero el error se muestra solo si estoy tratando de generar StreamField

class WeekChooserBlock(ModelChooserBlock): def get_api_representation(self, value, context=None): if value: return { ''title'': value.title, ''picture'': value.image, ''price'': value.price, ''ingredients'': value.ingredient, ''steps'': value.steps }

¡Gracias por su apoyo!