在Django 1.7中,我如何才能拥有两个模型字段中的一个?

时间:2015-03-06 20:42:04

标签: python django django-models

我正在构建一个基于django的Web应用程序来索引一些在线学习资源,例如MOOCS。一些MOOCS是“开放的”意味着它们可以随时以学习者自己的速度启动,而其他MOOCS则具有定义的开始和结束日期。对我来说,如果课程是开放的,那么就不需要开始日期,但如果它没有开放,我希望开始日期是必需的。有没有蚂蚁方法在我的model.py中执行此操作,或者是否应该仅使用表单验证来处理它。谢谢你的帮助。

目前:

class Post(models.Model):
    user = models.ForeignKey(User)
    title = models.CharField(max_length=70)
    description = models.CharField(max_length=300)
    url = models.URLField()
    post_date = models.DateTimeField('date posted')
    start_date = models.DateTimeField('date course starts', null=True, blank=True)
    open = models.BooleanField(default=False)
    ....
    def __unicode__(self):
        return self.title

1 个答案:

答案 0 :(得分:3)

您似乎知道如何使用表单验证,以便回答您的​​问题:

如您所说,您尝试做的最好是使用表单验证完成。现在,如果要在模型级别上执行此操作,以一种您将具有完整性(不是数据库完整性,但逻辑完整性)的方式,您应该覆盖模型的clean方法。你可以通过以下方式做到这一点:

def clean(self, *args, **kwargs):
    if not self.open and not self.start_date:
        raise ValidationError('This course is not open, therefore you need a start date')
    return super(Post, self).clean()

现在,如果您想要通过命令行强制clean()模型实例时强制save()运行,则需要添加逻辑完整性层,您可以在{{self.clean()中调用save() 1}}模型方法(请注意,这将在非命令行实例中运行self.clean()两次)。以下是最终代码的示例:

class Post(models.Model):
    user = models.ForeignKey(User)
    title = models.CharField(max_length=70)
    description = models.CharField(max_length=300)
    url = models.URLField()
    post_date = models.DateTimeField('date posted')
    start_date = models.DateTimeField('date course starts', null=True, blank=True)
    open = models.BooleanField(default=False)
    ....

    def clean(self, *args, **kwargs):
        if not self.open and not self.start_date:
            raise ValidationError('This course is not open, therefore you need a start date')
        return super(Post, self).clean()

    def save(self, *args, **kwargs):
        self.clean()
        return super(Post, self).save(*args, **kwargs)

    def __unicode__(self):
        return self.title