django - 由 2 个模型组成的其他模型中的 Django 本地模型
问题描述
为了更清楚,我想为分期付款创建一个电子商务应用程序
我在问题的底部准备了一个简短的 HTML 模板
我有以下模型:
class App_form(models.Model): #This is the head model
id_customer = models.CharField(max_length=200)
name = models.CharField(max_length=150, unique=True)
phone_regex = RegexValidator(regex=r'^\+?1?\d{9,12}$', message="Phone number must be entered in the format: '998981234567'. Up to 12 digits allowed.")
phone_number = models.CharField(validators=[phone_regex], max_length=13, unique=True)
#Models which I should combine and which will be named as: products_with_period model and it should belong only and only to this App_form model
warehouse = models.ManyToManyField(Warehouse)
product_period = models.OneToOneField(Product_period, on_delete=models.CASCADE)
def __str__(self):
return self.surname
#Product period
class Product_period(models.Model):
product_period = models.CharField(max_length=200, unique=True)
product_percent = models.FloatField()
product_periodvalue = models.FloatField()
def __str__(self):
return self.product_period
#Warehouse model
class Warehouse(models.Model):
category_product = models.ForeignKey(Category_product, on_delete=models.CASCADE)
product_name = models.CharField(max_length=200, unique=True)
condition = models.BooleanField(default=False)
amount = models.IntegerField()
barcode = models.BigIntegerField()
f_price = models.CharField(max_length=255, null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.product_name
我想在我的Rest Api中实现的仅来自组合products_with_period
模型
products_with_period = [{
id: 1,
product_name: " ",
product_fprice: " ",
product_period: {
"id": 2,
"product_period_name": " ",
"product_period_percent": " ",
},
{
id: 2,
product_name: " ",
product_fprice: " ",
product_period: {
"product_period": " ",
"product_period_percent": " ",
},
}],
这里是HTML模板,解释了本质
function addProduct() {
var table = document.getElementById("ProductTable");
var row = table.insertRow(1);
var cell1 = row.insertCell(0);
var cell2 = row.insertCell(1);
cell1.innerHTML = `
<div class="form-group">
<select class="form-control" >
<option value="1">Smartphone</option>
<option value="2">Smart TV</option>
<option value="3">Laptop</option>
<option value="4">Desktop</option>
<option value="5">Sofa</option>
<option value="6">Bicycle</option>
</select>
</div>
`;
cell2.innerHTML = `
<div class="form-group">
<select class="form-control" >
<option value="1">3 months</option>
<option value="2">6 months</option>
<option value="3">12 months</option>
<option value="4">24 months</option>
</select>
</div>
`;
}
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
<div class="container">
<div class="row">
<div class="col-md-12 p-4">
<div class="form-group">
<label for="c_name">Customer name:</label>
<input class="form-control" id="c_name" type="text">
</div>
<div class="form-group">
<label for="c_phone">Customer phone:</label>
<input class="form-control" id="c_phone" type="tel">
</div>
</div>
<table class="table table-bordered" id="ProductTable">
<thead>
<tr>
<th>Product name:</th>
<th>Installment period:</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<div class="form-group">
<select class="form-control">
<option value="1">Smartphone</option>
<option value="2">Smart TV</option>
<option value="3">Laptop</option>
<option value="4">Desktop</option>
<option value="5">Sofa</option>
<option value="6">Bicycle</option>
</select>
</div>
</td>
<td>
<div class="form-group">
<select class="form-control">
<option value="1">3 months</option>
<option value="2">6 months</option>
<option value="3">12 months</option>
<option value="4">24 months</option>
</select>
</div>
</td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan="2" class="text-center">
<button class="btn btn-success" onclick="addProduct()">add new product</button>
</td>
</tr>
</tfoot>
</table>
</div>
</div>
解决方案
你可以尝试这样的事情(它不使用 Django-rest 并且可能有一种方法可以使用序列化程序来做到这一点,但这是我想到的):
from django.http import JsonResponse
def product_api(request):
app_forms = App_form.objects.filter(product_period__isnull=False).all()
products_with_period = []
data = {}
for form in app_forms:
data['id'] = form.id
data['product_name'] = form.name
...
data['product_period']['id'] = form.product_period.id
data['product_period']['product_period_name'] = form.product_period.product_period
...
products_with_period.append(data)
data = {}
if request.is_ajax():
return JsonResponse(products_with_period)
else:
return HttpBadRequest()
然后可以通过模板中的 AJAX 函数注入:
<script type="text/javascript">
$("#button_or_object_id").click(function(){
$.ajax({
url: '{% url 'product_api' %}',
type: "GET",
dataType: "json",
cache: false
}).done(function(products_with_period) {
// do something with the products_with_period data
});
});
});
</script>
否则,您也可以在上下文中渲染它:
def product_api(request):
app_forms = App_form.objects.filter(product_period__isnull=False).all()
products_with_period = []
data = {}
for form in app_forms:
data['id'] = form.id
data['product_name'] = form.name
...
data['product_period']['id'] = form.product_period.id
data['product_period']['product_period_name'] = form.product_period.product_period
...
products_with_period.append(data)
data = {}
return render(request, 'template.html', context={'products_with_period':products_with_period})
然后手动渲染模板中的字典数组。
推荐阅读
- python - 匹配字符串之间的正则表达式
- c# - 如何将 GitVersion /UpdateAssemblyInfo 用于尚未提交的更改?
- excel - 根据 2 个单独单元格中的值生成某些列表
- aws-lambda - 如何使用 lambda 函数来确定要转到哪个 lex bot?
- sql - 一直说我必须声明 guest_id,任何人都可以提供有关此问题的见解吗?
- wordpress - woocommerce 以编程方式重新计算价格
- php - 连接失败:连接被拒绝...来自 PHP 代码的 MySQL 数据库,但我可以从 phpmyadmin 连接
- apache - 使用网页登录svn时出现500错误
- sql-server - 为什么 SELECT 在写入更多行时不读取已提交的行?
- python - stack 期望每个张量大小相等