如何设置Django模型的一个字段的值等于其他Django模型的其他字段

时间:2014-05-31 04:26:25

标签: django django-models django-forms django-admin

您好我将我的Django模型的一个字段的值设置为等于其他模型的其他字段的值。该值应该动态变化。

这是我的第一个模特

class MainModel(AbstractBaseUser, PermissionsMixin):

    email = models.EmailField(
            verbose_name='Email Address',
            max_length=255,
            unique=True)
    payment_online = models.ForeignKey(OnlinePayments, null=True, blank=True)
    register_date = models.DateTimeField(default=datetime.now, blank=True)
    purchase_date = models.CharField(max_length=32, default='')
    is_csr = models.BooleanField(default=False)
    is_admin = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=False)

这是第二个模型

class OnlinePayments(models.Model):

    payer_email = models.CharField(max_length=255, default=None, null=True)
    payer_name = models.CharField(max_length=255, default=None, null=True)
    timestamp = models.DateTimeField(auto_now_add=True, blank=True)

    def __str__(self):
        return self.payer_email

我想将MainModel中的purchase_date值设置为等于OnlinePayments中的时间戳值。

任何帮助都会被暗示

2 个答案:

答案 0 :(得分:6)

您实际上不需要维护具有相同值的两个字段。

我在MainModel上定义了一个方法,并从相关模型中获取timestamp

class MainModel(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(
            verbose_name='Email Address',
            max_length=255,
            unique=True)
    payment_online = models.ForeignKey(OnlinePayments, null=True, blank=True)
    ...

    def get_purchase_date(self):
        return self.payment_online.timestamp if self.payment_online else None

答案 1 :(得分:1)

我认为@alecxe提供了一个很好的答案 但是,如果您确实要将信息存储在2个位置,则可以覆盖OnlinePayments模型上的保存方法,这样无论何时在该模型上保存记录,您都可以手动将timestamp值保存到purchase_date中的MainModel

将以下保存方法添加到您的OnlinePayments模型中(填写评论下的purchase_date作业)

def save(self, *args, **kwargs):
    # save the value of self.timestamp into purchase_date

    super(OnlinePayments, self).save(*args, **kwargs)