首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何基于同一模型中其他字段的值设置django模型字段值

如何基于同一模型中其他字段的值设置django模型字段值
EN

Stack Overflow用户
提问于 2015-02-17 19:51:08
回答 2查看 1.9K关注 0票数 2

我希望分配一个NullBooleanField值,以始终反对同一模型中的其他字段值,但None除外。从下面的模型中,我想确定如果scam的值是True,那么whitelist的值也不能是True。但是如果scamNone,那么whitelist也可以设置为None。预期的标准如下:

  1. 如果scamTrue,则whitelist的允许值为FalseNone
  2. 如果scamFalse,则whitelist的允许值为TrueNone
  3. 如果scamNone,则whitelist的允许值为TrueFalseNone

因此,如何确保scam始终与whitelist相反

这是我的课堂模型:

代码语言:javascript
复制
class ExtendHomepage(models.Model):
    "extending homepage model to add more field"
    homepage = models.OneToOneField(Homepage)

    # True if the website is a scam, False if not, None if not sure
    scam = models.NullBooleanField(blank=True, null=True)

    # True if the webpage is already inspected, False if not 
    inspected = models.BooleanField(default=False)

    # True if the website is already reported, False if not yet 
    reported =  models.NullBooleanField(blank=True, null=True)

    # True if the website response is 200, else it is False
    access =  models.BooleanField(default=True)

    # True if the web should be whitelist, False if should not, None pending
    whitelist =  models.NullBooleanField(blank=True, null=True)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-17 20:03:08

我不确定我是否理解您的标准,但您可以使用验证:

代码语言:javascript
复制
def clean(self):
    if self.scam and self.whitelist:
        raise ValidationError("Can't set whitelist and scam simultaneously.")
    if self.scam is False and self.whitelist is False:
        raise ValidationError("Negate either whitelist or scam or none.")

真值表更新你的问题,这样我们就能理解你想要什么。

票数 1
EN

Stack Overflow用户

发布于 2015-02-17 20:15:04

为此,您可以制作一个属性、、getter和setter,类似于下面的代码:

代码语言:javascript
复制
class ExtendHomepage(models.Model):
    "extending homepage model to add more field"
    homepage = models.OneToOneField(Homepage)

    # True if the website is a scam, False if not, None if not sure
    scam = models.NullBooleanField(blank=True, null=True)

    # True if the webpage is already inspected, False if not 
    inspected = models.BooleanField(default=False)

    # True if the website is already reported, False if not yet 
    reported =  models.NullBooleanField(blank=True, null=True)

    # True if the website response is 200, else it is False
    access =  models.BooleanField(default=True)

    # True if the web should be whitelist, False if should not, None pending

    __whitelist = models.NullBooleanField(blank=True, null=True)

    @property
    def whitelist(self):
        if self.scam is not None and self.scam == self.__whitelist:
            # this if block is not necessary but for 
            # check if content changed directly in database manager
            # then assign None value to this attribute
            self.__whitelist = None
        return self.__whitelist

    @whitelist.setter
    def whitelist(self, value):
        self.__whitelist = value
        if self.scam is not None and self.scam == self.__whitelist:
            self.__whitelist = None
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28569940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档