当我列出Recipe
对象时会发生这种情况。试图尽可能做到这里,我没有得到任何错误,但我得到的响应是,如下:
# response of Recipe.objects.all()
[
{
"user": 1,
"name": "sandwich",
"ingredients": [
{},
{}
],
"created": "2021-01-11T00:47:04.932071-03:00",
"modified": "2021-01-11T00:47:04.932167-03:00"
}
]
当模型是:
class Recipe(models.Model):
user = models.ForeignKey('users.User', on_delete=models.CASCADE, null=False)
name = models.CharField(blank=False, max_length=50)
ingredients = models.ManyToManyField('recipes.Ingredient', through='recipes.IngredientComposition')
# some other fields...
class Ingredient(BaseModel):
name = models.CharField(blank=False, max_length=25, unique=True
error_messages={'unique': 'Ingredient already exists'})
class IngredientComposition(models.Model):
ingredient = models.ForeignKey('Ingredient', on_delete=models.CASCADE, null=False)
recipe = models.ForeignKey('recipes.Recipe', on_delete=models.CASCADE, null=False)
quantity = models.DecimalField(max_digits=21, decimal_places=3, null=False, default=1)
及其序列化器:
class RecipeSerializer(serializers.ModelSerializer):
ingredients = IngredientCompositionSerializer(read_only=True, many=True)
class Meta:
model = Recipe
fields = ['user', 'name', 'ingredients', 'created', 'modified']
class IngredientSerializer(serializers.ModelSerializer):
class Meta:
model = Ingredient
fields = ['name', 'created', 'modified']
class IngredientCompositionSerializer(serializers.HyperlinkedModelSerializer):
name = serializers.ReadOnlyField(source='ingredient.name')
class Meta:
model = IngredientComposition
fields = ['name', 'quantity']
预期的响应是:
[
{
"user": 1,
"name": "sandwich",
"ingredients": [
{"name": "bread", "quantity": 2.0},
{"name": "cheese", "quantity": 3.0}
],
"created": "2021-01-11T00:47:04.932071-03:00",
"modified": "2021-01-11T00:47:04.932167-03:00"
}
]
我想念什么?
添加相关名称 recipe
class IngredientComposition(models.Model):
ingredient = models.ForeignKey('Ingredient', on_delete=models.CASCADE, null=False)
recipe = models.ForeignKey('recipes.Recipe', on_delete=models.CASCADE, null=False, related_name='ingredients_list') # change here
quantity = models.DecimalField(max_digits=21, decimal_places=3, null=False, default=1)
然后将该字段添加到 RecipeSerializer
class RecipeSerializer(serializers.ModelSerializer):
ingredients_list = IngredientCompositionSerializer(read_only=True, many=True) # change here
class Meta:
model = Recipe
fields = ['user', 'name', 'ingredients_list', 'created', 'modified'] # change here 'ingredients_list'
正如ingredients
已经ManyToManyField
在模型中那样Recipe
,它会导致该问题。
PS:我认为您不需要ingredients = models.ManyToManyField('recipes.Ingredient', through='recipes.IngredientComposition')
字段,但我不了解您的其余业务逻辑...
该解决方案应该不管。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句