【问题标题】:Django model foreign key filtering on integer issueDjango模型外键过滤整数问题
【发布时间】:2019-06-30 17:59:27
【问题描述】:

我有一个建筑模型,其中包含一个指示建筑类型的整数字段:

class Building(models.Model):
    building_type = models.PositiveIntegerField('Building Type')

我有一个 BuildingUnit 模型,其中包含对 Building 的外键引用:

class BuildingUnit(models.Model):
    building_fk = models.ForeignKey(
        'Building',
        on_delete=models.CASCADE, verbose_name="Building"
    )

我正在重写 BuildingUnit 模型的 init 函数并尝试根据整数值(建筑物的类型)过滤外键:

self.base_fields['building_fk'].queryset = BuildingUnit.objects.filter
(building_fk__building_type=16)

它不起作用。所有建筑类型都继续回归。当我调试和检查 SQL 语句时,它说语法无效。 WHERE 子句说 building.building_type=16。在我看来是对的。我正在使用 Postgres。如何使 Django 中的 objects.filter() 在 PLPGSQL 中正确评估整数?

【问题讨论】:

  • 我们需要更多的上下文。该代码很好(除了它应该是字段而不是 base_fields)但我们不知道它在哪里被调用以及可能发生的其他事情。显示表单的其余部分和视图。
  • 好吧,天哪,威利克斯,就在那里修好了。将 base_fields 更改为字段。我真的非常感谢你!我现在将自学fields和base_fields之间的区别

标签: django postgresql django-models foreign-keys


【解决方案1】:

base_fields 是元类执行时找到的所有字段的列表。这些字段实际上是直接在类上声明的,例如原始/全局/主定义。

字段 是那些实际用于为表单生成 HTML 以及验证用户输入的字段。它以 base_fields 的副本开始,并且可以在自定义表单时使用 fields,例如向表单动态添加新字段,或更改现有字段。

base_fieldsfields 类似于蓝图和实际建造的建筑物。蓝图是主要定义。一旦您在那里进行了更改,该更改是全局的并且在范围内是持久的。 fields 就像你建造的房子。您可以根据原始规格制作任意数量的相同类型的房屋。但是,您可以对每一栋房子进行定制,使每一栋房子都独一无二。

这对我不起作用,因为我没有将过滤后的值分配给生成实际 HTML 输出的 field 属性。

【讨论】:

    猜你喜欢
    • 2018-02-03
    • 2012-07-15
    • 2018-03-19
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 2016-08-05
    • 1970-01-01
    相关资源
    最近更新 更多