如何在 JSON 响应中存储多对多 Django 字段的值?

问题描述

我正在尝试从包含多对多字段的模型访问数据。 我的主要模型是产品。

class Product(models.Model):
    id = models.IntegerField(unique=True,auto_created=True,primary_key=True)
    name = models.CharField(max_length=80,unique=True)
    price = models.CharField(max_length=100,null=True)
    size = models.ManyToManyField(Size)
    size2 = models.CharField(max_length=50,null=True)
    detail = models.CharField(max_length=1000,null=True)
    date_created = models.DateTimeField(auto_Now_add=True,null=True)
    product_image = models.ImageField(upload_to='product_image/',null=True,blank=True)
    category = models.ForeignKey(Procategory,on_delete=models.CASCADE,related_name='products',null=True)
    class Meta:
        ordering = ('-date_created',)
    def __str__(self):
        return self.name

尺寸字段的型号为:

class Size(models.Model):
    name = models.CharField(max_length=200,db_index=True,null=True)
    def __str__(self):
        return self.name

我想在我的视图函数中访问产品尺寸,并想将尺寸存储在 JSON 响应中。

我的视图函数

def validate_username(request):
    username = request.GET.get('name',None)
    product = Product.objects.get(id=username)
    result = Product.objects.all()
    for size1 in result:
        a =size1.size.all()
    data1 = serializers.serialize('json',product.size.all())
    data = {
    'is_taken': Product.objects.all().filter(id=username).exists(),'name': product.name,'detail': product.detail,'price': product.price,'id': product.id,'image': product.product_image.url,'size':data1

    }
    if data['is_taken']:
        data['error_message'] = 'A user with this username already exists.'

        data['name2'] = 'hi...'

    return JsonResponse(data)

我的尺寸 Js 代码

var b= data.size;

document.getElementById("product-size").innerHTML = b;

结果:

[{"model": "medical_store_app.size","pk": 1,"fields": {"name": "300ml"}},{"model": "medical_store_app.size","pk": 2,"fields": {"name": "500g"}}]

但我只想显示“300ml”和“500g”的尺寸。 怎么办?

解决方法

您不需要使用 Django 的序列化程序来序列化 API 响应的数据;它们也不是真正意义上的,因为您的模型的内部结构可能与您想要发布的内容大不相同。许多人倾向于使用 Django REST Framework,它有更灵活的方式来声明序列化。

除此之外,你的函数很奇怪,因为

  • 您无缘无故地遍历数据库中的所有产品
  • 在您已经.get()编辑产品之后检查它是否存在(如果它不存在就会失败)

我认为您正在寻找类似的东西

def retrieve_product(request):
    product = Product.objects.get(id=request.GET["name"])
    data = {
        "name": product.name,"detail": product.detail,"price": product.price,"id": product.id,"image": product.product_image.url,"sizes": list(product.size.values_list("name",flat=True)),}
    return JsonResponse(data)

编辑

如前所述,要为默认大小(如果有)添加一个字段,

def retrieve_product(request):
    product = Product.objects.get(id=request.GET["name"])
    size_names = list(product.size.values_list("name",flat=True))
    data = {
        "name": product.name,"sizes": size_names,"default_size": next(iter(size_names),None),}
    return JsonResponse(data)

应该这样做。