我正在尝试从包含多对多字段的模型中访问数据。 我的主要模型是产品。
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"}}]
但我只想显示"300毫升"和"500克"的尺寸。 怎么能做到呢?
你不需要使用 Django的序列化程序来序列化 API 响应的数据;它们也不是真正用于此目的的,因为模型的内部结构可能与你想要发布的有很大不同。许多人倾向于使用 Django REST 框架,它有一种更灵活的方式来声明序列化。
除此之外,你的功能很奇怪,因为
- 您无缘无故地遍历数据库中的所有产品
- 您在
.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,
"detail": product.detail,
"price": product.price,
"id": product.id,
"image": product.product_image.url,
"sizes": size_names,
"default_size": next(iter(size_names), None),
}
return JsonResponse(data)
应该做。