如何在 django 中将模型与不同的应用程序相乘?

Posted

技术标签:

【中文标题】如何在 django 中将模型与不同的应用程序相乘?【英文标题】:How to multiply model with different app in django? 【发布时间】:2017-07-10 02:32:42 【问题描述】:

要计算在外键但在不同应用程序中与另一个模型相乘的模型,这里是 penjualan appdetail_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_jualinitialdetail_penjualan_obat 的初始对象

以上是关于如何在 django 中将模型与不同的应用程序相乘?的主要内容,如果未能解决你的问题,请参考以下文章

在 django 中将两个字段相乘

如何在openGL中将矩阵相乘

如何在 django 中将多个图像一起发布?

Django:在模型选择中将惰性翻译与标记安全相结合

如何在sas中将每一行与另一个矩阵元素的每一行相乘?

在vba中将列与文本框值相乘