【问题标题】:How to switch a boolean field when there is a change in another field in django?django中另一个字段发生变化时如何切换布尔字段?
【发布时间】:2019-09-19 09:44:28
【问题描述】:

ManyToMany 字段(标记)发生变化时,我正在尝试切换布尔字段(标记)。我该怎么做?

class Tagger(models.Model):
    tagged = models.BooleanField(default = False)
    appName =  models.ForeignKey(AppName,on_delete=models.CASCADE, null=True, blank=True)
    tag = models.ManyToManyField(Tag,blank=True)

当“标签”中有输入时,我希望“标签”字段切换为 True 反之亦然。

【问题讨论】:

  • 输入后,检查变量“appName”。如果不为 null,则更改 'tagged' 的状态
  • 为什么要改变。如果之前和之后都有标签,标签被删除或更改怎么办?此外,如果您正在做我认为您正在做的事情,那么信息是多余的并且很容易查询:tag__isnull=False 对应于任何查询中的tagged=True
  • 您通常会使用信号。
  • 正如@schwobaseggl 和熊布朗所说,永远不要为可以从数据库中现有数据轻松计算的数据创建字段。它只会让人头疼。

标签: python django boolean


【解决方案1】:

看起来简单的方法是使用property

class Tagger(models.Model):
    appName =  models.ForeignKey(AppName,on_delete=models.CASCADE, null=True, blank=True)
    tag = models.ManyToManyField(Tag, blank=True)

    @property
    def tagged(self):
        return bool(self.tag.all())

要在管理仪表板中显示该字段,只需将其添加到 list_display,例如:

class TaggerAdmin(admin.ModelAdmin):
    list_display = (..., 'tagged')

【讨论】:

  • 好的,我怎样才能在管理仪表板的列表显示中显示这个标记?
  • list_display = ('tagged','appName')
  • 抱歉,我的意思是如何将“标记”添加到 list_filter。
  • 它有效,但我可以在不使用该属性的情况下做同样的事情吗?那是通过保持布尔字段“标记”..
猜你喜欢
  • 2021-01-15
  • 1970-01-01
  • 2019-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-23
  • 2020-10-09
相关资源
最近更新 更多