Python 在单个JSON中包装多个值并存储在model-Django中
我想在单个JSON字段中存储多个输入 这是顺序表,有一个“attribute_field”,我想在这个字段中存储属性 作为JSON 型号.pyPython 在单个JSON中包装多个值并存储在model-Django中,python,json,django,django-models,model,Python,Json,Django,Django Models,Model,我想在单个JSON字段中存储多个输入 这是顺序表,有一个“attribute_field”,我想在这个字段中存储属性 作为JSON 型号.py class Order(models.Model): order_id = models.AutoField("Order ID", primary_key=True) user_id = models.ForeignKey(User, on_delete=models.CASCADE, null=False, ver
class Order(models.Model):
order_id = models.AutoField("Order ID", primary_key=True)
user_id = models.ForeignKey(User, on_delete=models.CASCADE, null=False, verbose_name="Customer ID")
prod_id = models.ForeignKey(Product, on_delete=models.CASCADE, null=False, verbose_name="Product ID")
quantity = models.ImageField('Product Quantity', max_length=10, default=500)
attribute_value = models.CharField("Item Details JSON", max_length=2000, null=False)
order_price = models.DecimalField(max_digits=8, decimal_places=2, default=0000.00)
def order(request, id):
if request.method == 'POST':
customer_id = request.user.user_id
product_id = id
try:
size = request.POST['size']
except MultiValueDictKeyError:
pass
try:
Colour = request.POST['Color']
except MultiValueDictKeyError:
pass
try:
Paper_Choice = request.POST['PaperChoice']
except MultiValueDictKeyError:
pass
return render(request, 'user/order.html')
def order(request, id):
if request.method == 'POST':
customer = request.user
product_id = id
try:
size = request.POST['size']
except MultiValueDictKeyError:
pass
try:
Colour = request.POST['Color']
except MultiValueDictKeyError:
pass
try:
Paper_Choice = request.POST['PaperChoice']
except MultiValueDictKeyError:
pass
order = Order.objects.filter(user=customer, prod=product_id).first()
value = dict(size=size, Colour=Colour, Paper_Choice=Paper_Choice)
order.attribute_value = json.dumps(value)
order.save()
return render(request, 'user/order.html', {'order': order})
视图.py
class Order(models.Model):
order_id = models.AutoField("Order ID", primary_key=True)
user_id = models.ForeignKey(User, on_delete=models.CASCADE, null=False, verbose_name="Customer ID")
prod_id = models.ForeignKey(Product, on_delete=models.CASCADE, null=False, verbose_name="Product ID")
quantity = models.ImageField('Product Quantity', max_length=10, default=500)
attribute_value = models.CharField("Item Details JSON", max_length=2000, null=False)
order_price = models.DecimalField(max_digits=8, decimal_places=2, default=0000.00)
def order(request, id):
if request.method == 'POST':
customer_id = request.user.user_id
product_id = id
try:
size = request.POST['size']
except MultiValueDictKeyError:
pass
try:
Colour = request.POST['Color']
except MultiValueDictKeyError:
pass
try:
Paper_Choice = request.POST['PaperChoice']
except MultiValueDictKeyError:
pass
return render(request, 'user/order.html')
def order(request, id):
if request.method == 'POST':
customer = request.user
product_id = id
try:
size = request.POST['size']
except MultiValueDictKeyError:
pass
try:
Colour = request.POST['Color']
except MultiValueDictKeyError:
pass
try:
Paper_Choice = request.POST['PaperChoice']
except MultiValueDictKeyError:
pass
order = Order.objects.filter(user=customer, prod=product_id).first()
value = dict(size=size, Colour=Colour, Paper_Choice=Paper_Choice)
order.attribute_value = json.dumps(value)
order.save()
return render(request, 'user/order.html', {'order': order})
这里我没有做表单保存方法,但让我解释一下我想做什么
我想包装尺寸、颜色、纸张选择为单一JSON,并将其存储在模型的Attribute_values字段中,但不知道如何做,请您向我解释。如果您的Django版本>=3.1,您可以使用
JSONField
,否则使用TextField
。
大概是这样的:
class Order(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="Customer")
prod = models.ForeignKey(Product, on_delete=models.CASCADE, verbose_name="Product")
quantity = models.ImageField('Product Quantity', max_length=10, default=500)
attribute_value = models.TextField("Item Details JSON")
price = models.DecimalField(max_digits=8, decimal_places=2, default=0)
视图.py
class Order(models.Model):
order_id = models.AutoField("Order ID", primary_key=True)
user_id = models.ForeignKey(User, on_delete=models.CASCADE, null=False, verbose_name="Customer ID")
prod_id = models.ForeignKey(Product, on_delete=models.CASCADE, null=False, verbose_name="Product ID")
quantity = models.ImageField('Product Quantity', max_length=10, default=500)
attribute_value = models.CharField("Item Details JSON", max_length=2000, null=False)
order_price = models.DecimalField(max_digits=8, decimal_places=2, default=0000.00)
def order(request, id):
if request.method == 'POST':
customer_id = request.user.user_id
product_id = id
try:
size = request.POST['size']
except MultiValueDictKeyError:
pass
try:
Colour = request.POST['Color']
except MultiValueDictKeyError:
pass
try:
Paper_Choice = request.POST['PaperChoice']
except MultiValueDictKeyError:
pass
return render(request, 'user/order.html')
def order(request, id):
if request.method == 'POST':
customer = request.user
product_id = id
try:
size = request.POST['size']
except MultiValueDictKeyError:
pass
try:
Colour = request.POST['Color']
except MultiValueDictKeyError:
pass
try:
Paper_Choice = request.POST['PaperChoice']
except MultiValueDictKeyError:
pass
order = Order.objects.filter(user=customer, prod=product_id).first()
value = dict(size=size, Colour=Colour, Paper_Choice=Paper_Choice)
order.attribute_value = json.dumps(value)
order.save()
return render(request, 'user/order.html', {'order': order})
看看这是否解决了您的问题-谢谢它工作正常,但我忘了提到一件事,如果用户只选择了选择字段,那么值应该添加到属性值中,否则不会,所以我想我必须首先创建一个字典,然后使用append方法,如果选择了大小或大小,则尝试在其中存储值不用了,谢谢。它也在按我的要求工作。对于我提出的问题,它是有效的。