django - 无法在同一序列化程序中获取外键表的数据
问题描述
订单表
class Orders(models.Model):
restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE, blank=True, null=True)
tableid=models.IntegerField()
orderid=models.IntegerField()
total_amount = models.DecimalField(max_digits=10, decimal_places=2)
文章表用于保存比萨饼等文章
class OrderArticle(models.Model):
order = models.ForeignKey(Orders, on_delete=models.CASCADE)
article = models.ForeignKey(Articles, on_delete=models.CASCADE)
# article_options = models.ManyToManyField(ArticlesOptions)
保存额外浇头的文章选项或任何可用选项
class OrderArticleOptions(models.Model):
# order = models.ForeignKey(Orders, on_delete=models.CASCADE)
article_option = models.ForeignKey(ArticlesOptions, on_delete=models.CASCADE)
order_article = models.ForeignKey(OrderArticle, on_delete=models.CASCADE)
quantity = models.IntegerField(default=1)
price = models.DecimalField(max_digits=10, decimal_places=2)
编辑
文章选项表
class ArticlesOptions(models.Model):
articleoptionrestaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE , blank=True, null=True)
optionname = models.ForeignKey(ArticlesOptionsName, on_delete=models.CASCADE, related_name="optionnames")
min = models.IntegerField()
max = models.IntegerField()
choice_price = models.DecimalField(max_digits=10, decimal_places=2)
choice = models.CharField(max_length=255)
def __str__(self):
return str(self.optionname)
所以现在的问题是当我尝试在一个序列化中获取所有数据时,我无法获得 . 我正在使用这个例子来获取
https://www.django-rest-framework.org/api-guide/relations/
编辑
我的序列化器是
class OrderSerializer(serializers.ModelSerializer):
restaurant=RestaurantSerializer(required=False)
class Meta:
model = Orders
fields = ['restaurant','tableid', 'orderid', 'total_amount']
class ArticlesSerializer(serializers.ModelSerializer):
order = OrderSerializer(read_only=True)
article=ListArticleSerializer(read_only=True)
class Meta:
model = OrderArticle
fields = ['order', 'article']
class ArticlesOptionSerializer(serializers.ModelSerializer):
article_option = ListCategoriesSerializer( read_only=True)
order_article=ArticlesSerializer(read_only=True)
class Meta:
model = OrderArticleOptions
fields = ['article_option','order_article','quantity','price']
depth=1
我的 view.py 是
class OrderedArticles(APIView):
def get(self, request, restid):
Options=OrderArticleOptions.objects.filter(order_article=1)
orderserlizer=ArticlesOptionSerializer(Options , many=True)
return Response(success_response({'orders': orderserlizer.data},
"Restaurant with this all data."), status=status.HTTP_200_OK)
我的 JSON 响应是
"article_option":{ },
"order_article":{
"order":{
"restaurant":{ },
"tableid":12,
"orderid":1,
"total_amount":"0.00"
},
"article":{
"id":1,
"category":{ },
"ingredient":[ ],
"articleoptionnames":{ },
"restaurant":{ },
"articlename":"Article1",
"price":"1.90",
"pickuptax":6,
"dineintax":21,
"description":"This is a tekst field with more information about the product",
"image":"/media/Article/c1.264f3b28_sxcPiqi.png"
}
},
虽然我希望这些“article_option”成为文章 {article_option1, article_option2} 之类的文章的子项,但它会使用每个新文章选项创建新对象。
解决方案
如果我对您的理解正确,您想返回一个以OrderArticle
对象ArticleOption
为子对象的表示。这意味着您应该在您的视图中实例化 an ArticlesSerializer
,但也要进行修改ArticlesSerializer
以使其包含所有相关article_options
的列表(使用source
属性)。类似于以下内容:
class ArticlesOptionSerializer(serializers.ModelSerializer):
article_option = ListCategoriesSerializer(read_only=True)
class Meta:
model = OrderArticleOptions
fields = ['article_option', 'order_article', 'quantity', 'price']
class ArticlesSerializer(serializers.ModelSerializer):
order = OrderSerializer(read_only=True)
article = ListArticleSerializer(read_only=True)
article_options = ArticlesOptionSerializer(read_only=True, source='orderarticleoptions_set', many=True)
class Meta:
model = OrderArticle
fields = ['order', 'article', 'article_options']
然后在您看来,您应该ArticlesSerializer
使用适当的OrderArticle
对象实例化您的:
class OrderedArticles(APIView):
def get(self, request, restid):
order_article = OrderArticle.objects.get(pk=1) # get pk/id from request
serializer = ArticlesSerializer(order_article)
return Response(serializer.data, status=status.HTTP_200_OK)
推荐阅读
- awk - awk 从多列行中排除特定列
- ios - Xcode - 为什么“常规”下没有“嵌入式二进制文件”?
- java - 使用 ActiveDirectory 用户/通行证查找的 HTTP 基本身份验证
- oracle - 创建触发器时出现 oracle 错误 ORA-24344
- canvas - 画布覆盖图像
- entity-framework - 遵循 DDD 时使用 EF 跨多个聚合进行查询
- ssis - 通过 SQL 代理与 Visual Studio 执行的 SSIS 父主作业
- regex - 使用 grep 从 JSON 中提取字符串
- javascript - 无法从源代码读取图像的高度/宽度
- javascript - 节点红色 UI_Template 发送消息