django rest在请求中获取嵌套数据

fnatzsnv  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(471)

我是刚用django和drf的。我有一个问题,要求一个模型与foreig键。
我有这3种型号:

  1. class Order(models.Model):
  2. id = models.BigAutoField(primary_key=True)
  3. user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="user")
  4. fecha = models.DateTimeField(auto_now=True)
  5. def __str__(self):
  6. return f"Orden : {self.id}"
  7. class Product(models.Model):
  8. id = models.BigIntegerField(primary_key=True)
  9. name = models.CharField(max_length=100)
  10. def __str__(self):
  11. return self.name
  12. class OrderDetail(models.Model):
  13. order = models.ForeignKey(Order, related_name="orders", on_delete=models.CASCADE)
  14. product = models.ForeignKey(Product, related_name="products", on_delete=models.CASCADE)

我想从详细信息中检索其产品的所有订单数据:
例子:

  1. { oders :[
  2. { id : 1 ,
  3. user : 1 ,
  4. fecha : 01/02/2021,
  5. products : [
  6. { id : 1 , name : "product1" }
  7. { id : 2 , name : "prodcut2" }
  8. },
  9. { id : 2 ,
  10. user : 2 ,
  11. fecha : 10/02/2021,
  12. products : [
  13. { id : 3 , name : "product3" }
  14. ]
  15. }
  16. ]}

我的序列化程序是:

  1. class ProductSerializer(serializers.ModelSerializer):
  2. class Meta:
  3. model = Product
  4. fields = ["id", "name"]
  5. class OrderDetailSerializer(serializers.ModelSerializer):
  6. class Meta:
  7. model = OrderDetail
  8. fields = ['order' ,'product']
  9. class OrderSerializer(serializers.ModelSerializer):
  10. products = OrderDetailSerializer(many=True)
  11. class Meta:
  12. model = Order
  13. fields = ['id', 'user', 'fecha' ,'products']

但我得到了一个错误:
attributeerror:尝试获取序列化程序“orderserializer”上字段“products”的值时获取attributeerror。序列化程序字段的名称可能不正确,并且与“order”示例上的任何属性或键都不匹配。原始异常文本为:“订单”对象没有属性“产品”。
我正在使用:

  1. Django==3.2.5
  2. djangorestframework==3.12.4
  3. python==3.8

如果有人能帮助我,我将不胜感激

tct7dpnv

tct7dpnv1#

通过orderdetail模型添加多对多关系

  1. class Order(models.Model):
  2. id = models.BigAutoField(primary_key=True)
  3. user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="user")
  4. fecha = models.DateTimeField(auto_now=True)
  5. products = models.ManyToMany(Product, through="OrderDetail")
  6. def __str__(self):
  7. return f"Orden : {self.id}"

相关问题