问题描述
我正在尝试从包含多对多字段的模型访问数据。 我的主要模型是产品。
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)
应该这样做。