【问题标题】:Knowing if a foreign key is selected or not selected知道是否选择了外键
【发布时间】:2014-11-24 16:26:04
【问题描述】:
class Foo(models.Model):
    name = models.CharField(max_length=256)
    total = models.SmallIntegerField()
    availability = models.SmallIntegerField()

class Bar(models.Model):
    somthing = ...
    foo = models.ForeignKey(Foo, blank=True, null=True)

每次您保存 Bar,并且用户选择了 Foo 时,它必须将可用性降低 1。当用户从 Foo 中取消选择一个选项时,它会将可用性增加 1。因此,如果您选择另一个选项,则该选项减 1,取消选择的选项加 1。

是否有信号可以用来检测外键是否被选中?

【问题讨论】:

  • 是否需要明确存储availability?每次使用简单的foo.bar_set.count() 或聚合来计算可能会更好。
  • 我需要存储它,是的,它可以在应用程序中再次使用。但这将如何改变任何事情?
  • “另一种用途”并不意味着您必须实际存储它:您可以每次为“其他用途”计算它吗?它改变了一些事情,因为非规范化,也就是你在这里所说的,很棘手,并且存在事情不同步的风险。
  • 好的,可以说它不必存储。我明白我们的说法

标签: python django django-models django-signals


【解决方案1】:

您可以存储限制并根据限制和当前使用情况计算可用性,而不是存储availability

类似

class Foo(models.Model):
    name = models.CharField(max_length=256)
    total = models.SmallIntegerField()
    limit = models.SmallIntegerField() 

    def get_availability(self):
        return limit - self.bar_set().count()

您可以将availability 作为模型的属性而不是方法调用。

【讨论】:

    猜你喜欢
    • 2021-05-31
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 2023-03-12
    • 2021-10-10
    相关资源
    最近更新 更多