如何在 django 中将模型与不同的应用程序相乘?
Posted
技术标签:
【中文标题】如何在 django 中将模型与不同的应用程序相乘?【英文标题】:How to multiply model with different app in django? 【发布时间】:2017-07-10 02:32:42 【问题描述】:要计算在外键但在不同应用程序中与另一个模型相乘的模型,这里是 penjualan app 和 detail_penjualan_obat 模型:
class detail_penjualan_obat(models.Model):
kd_penjualan_detail = models.ForeignKey(penjualan_obat)
kd_obat_detail = models.ForeignKey(obat)
jumlah_jual = models.IntegerField()
total_harga_perobat = MoneyField(max_digits=10, decimal_places=2, default_currency='IDR')
def __unicode__(self):
return self.total_harga_perobat
和 obat 应用模型:
class obat(models.Model):
jenis_obat =
('obat bebas','Obat Bebas'),
('obat bebas terbatas','Obat Bebas Terbatas'),
('obat keras dan psikotropika','Obat Keras dan Psikotropika')
kd_obat = models.CharField(primary_key = True, default = '', max_length = 10, validators=[RegexValidator(r'^\d1,10$')])
nama_obat = models.CharField(max_length = 15)
tipe_obat = models.CharField(max_length = 35, choices = jenis_obat)
harga_jual = MoneyField(max_digits=10, decimal_places=2, default_currency='IDR')
def __unicode__(self):
return self.kd_obat
和 view.py :
def data_penjualan_obat_detail(request):
if request.method == 'POST':
form_data = request.POST
form = penjualan_detail_form(form_data)
if form.is_valid():
input_detail_penjualan = detail_penjualan_obat(
kd_penjualan_detail = form.cleaned_data.get('kd_penjualan_detail'),
kd_obat_detail = form.cleaned_data.get('kd_obat_detail'),
jumlah_jual = request.POST['jumlah_jual'],
total_harga_perobat = form.cleaned_data.get('total_harga_perobat')
)
input_detail_penjualan.save()
return redirect('/')
else:
form = penjualan_detail_form()
return render(request, 'penjualan_detail.html','form':form)
这里的功能: total_harga_perobat = harga_jual * jumlah_jual
该功能如何在视图中“放置和工作”?
对不起,我的英语不好,但我希望你能理解我的问题,并解决我的问题
编辑:
这里是 penjualan_obat 的模型:
class penjualan_obat(models.Model):
kd_penjualan = models.CharField(primary_key = True, default = '', max_length = 10, validators=[RegexValidator(r'^\d1,10$')], unique = True)
kd_costumer_obat = models.ForeignKey(costumer)
tgl_penjualan = models.DateField(auto_now_add = True)
total_penjualan = MoneyField(max_digits=10, decimal_places=2, default_currency='IDR')
def __unicode__(self):
return self.kd_penjualan
和表格 penjualan_detail_form :
class penjualan_detail_form(ModelForm):
class Meta:
model = detail_penjualan_obat
fields = ['kd_penjualan_detail','kd_obat_detail','jumlah_jual']
labels =
'kd_penjualan_detail' : 'Kode Penjualan',
'kd_obat_detail' : 'Kode Obat',
'jumlah_penjualan' : 'Jumlah Penjualan',
error_messages =
'kd_penjualan_detail':
'required':'Anda harus memilih kode penjualan'
,
'kd_obat_detail':
'required':'Anda harus memilih kode obat'
,
'jumlah_penjualan':
'required':'Anda harus mengisi jumlah penjualan'
,
【问题讨论】:
给我你的penjualan_obat
的型号和penjualan_detail_form
的形式
这里 penjualan_obat 模型:github.com/Rifqi31/SI_Apotek/blob/master/costumer/models.py 和 penjualan_detail_form:github.com/Rifqi31/SI_Apotek/blob/master/costumer/forms.py
【参考方案1】:
更正
我建议您使用标准命名更改模型类名称。
class detail_penjualan_obat(models.Model)
到 class DetailPenjualanObat(models.Model)
的示例
我建议你不要在你的unique
字段中使用default = ''
。
每当您迁移数据库时,这都会很困难。
为什么要实现form.cleaned_data.get('total_harga_perobat')
的形式,
如果你真的想自动保存它?您应该在后端处理它。
我检查了你的源代码和你的
penjualan_detail_form
已经实例化到detail_penjualan_obat
的模型。可能像下面这样;
def data_penjualan_obat_detail(request):
if request.method == 'POST':
form = penjualan_detail_form(request.POST)
if form.is_valid():
initial = form.save(commit=False)
initial.total_harga_perobat = initial.kd_obat_detail.harga_jual * initial.jumlah_jual
initial.save()
form.save()
return redirect('/')
else:
form = penjualan_detail_form()
return render(request, 'penjualan_detail.html', 'form': form)
希望对你有帮助..
更新
您也可以在您的models.py
中处理它,例如:
class DetailPenjualanObat(models.Model):
kd_penjualan_detail = models.ForeignKey(penjualan_obat)
kd_obat_detail = models.ForeignKey(obat)
jumlah_jual = models.IntegerField()
total_harga_perobat = MoneyField(max_digits=10, decimal_places=2, default_currency='IDR')
def save(self, *args, **kwargs):
self.total_harga_perobat = self.kd_obat_detail.harga_jual * self.jumlah_jual
super(DetailPenjualanObat, self).save(*args, **kwargs)
另见pre save
,喜欢这个answer
【讨论】:
如果在后端或模型中,如何计算? 我已经包含了它initial.total_harga_perobat = initial.kd_obat_detail.harga_jual * initial.jumlah_jual
,initial
是detail_penjualan_obat
的初始对象以上是关于如何在 django 中将模型与不同的应用程序相乘?的主要内容,如果未能解决你的问题,请参考以下文章