如何在Django中克隆另一个模型中的模型字段?

时间:2012-10-30 05:29:59

标签: django

class Medicine(models.Model):
    medicine_name = models.CharField(primary_key=True)
    price = models.IntegerField(max_length=30)

class Bill(models.Model):
    regid = models.ForeignKey(Patient)
    medicine_name = models.ForeignKey(Medicine)
    quantity = models.IntegerField()

我想要的是在'Bill'模型中有一个'price'字段,'price'字段的值应该与'medicine'模型中基于'medicine_name'的'price'字段的值相同< / p>

2 个答案:

答案 0 :(得分:1)

我假设您要复制它而不是引用它。因此,如果将来医药价格发生变化,过去的账单就不会改变。

因此,您可以在Bill中添加类似字段并实施pre_save信号,以便将相同的价格作为药品对象。

class Bill(models.Model):
    regid = models.ForeignKey(Patient)
    medicine_name = models.ForeignKey(Medicine)
    quantity = models.IntegerField()
    price = models.IntegerField(max_length=30)

@receiver(pre_save, sender=Bill, dispatch_uid="my_unique_identifier")
def signal_price_populate(sender, **kwargs):
    try:
        inst = kwargs['instance']
        inst.price = inst.machine_name.price
    except Exception:
        #something not right

答案 1 :(得分:0)

由于您已经将Medicine作为ForeignKey,您可以通过此关系访问价格。即

medicine_name__price

但是,如果您想要一个直接链接到价格值的字段,那么您可以使用ForeignKey的进一步规范。

class Bill(models.Model):
    regid = models.ForeignKey(Patient)
    medicine_name = models.ForeignKey(Medicine)
    quantity = models.IntegerField()
    price = models.ForeignKey(Medicine, to_field="price")

更多信息后更新:

如果您想在保存Bill模型时根据药物模型中的价格值在Bill模型中设置价格字段,您可以在保存模型或表单时执行此操作。这假设您的medicine_name foreignkey正常工作,以便我们可以通过此关系调用价格的值。

class Bill(models.Model):
    regid = models.ForeignKey(Patient)
    medicine_name = models.ForeignKey(Medicine)
    quantity = models.IntegerField()
    price = models.IntegerField(max_length=30)
    def save(self, *args, **kwargs):
        self.price = self.medicine_name.price
        super(Bill, self).save(*args, **kwargs)