【问题标题】:Django checking if model fields are equalDjango检查模型字段是否相等
【发布时间】:2015-08-11 13:56:13
【问题描述】:

所以我得到了这个

{% if articulo.Tipos == sth.tipo %}
    Equal
{% else %}
    Not Equal
{% endif %}

但即使字段具有相同的值,它也不会返回 true。 顺便说一句,articulo.Tipo 是 sth.tipo 的外键,知道为什么它不能正常工作吗?

型号:

class Productos(models.Model):
    tipo = models.ForeignKey("TiposOpciones", null=True, blank=True, related_name='Productos_tipo')

class TiposOpciones(models.Model):
    Tipos = models.CharField(max_length=50, null=True)

观看次数:

tiposopciones = TiposOpciones.objects.all()
productos = Productos.objects.all()

【问题讨论】:

    标签: django compare field models


    【解决方案1】:

    要调试这种情况,显示您在模板中比较的值会很方便:

    articulo.Tipos = '{{ articulo.Tipos }}'<br>
    sth.tipo = '{{ sth.tipo }}'<br>
    
    {% if articulo.Tipos == sth.tipo %}
        Equal
    {% else %}
        Not Equal
    {% endif %}
    

    此外,如果您比较实例,最好比较它们的 ID:

    {% if articulo.Tipos.id == sth.tipo.id %}
    

    【讨论】:

    • 在比较模型实例时,Django 会在后台自动比较 ID。
    • 我不想检查 id ,而是检查值。也似乎 articulos.Tipos.id 没有返回任何东西,因为我想它是一个外键?检查值的任何其他想法?
    • 如果您将模型代码添加到您的问题中,它会有所帮助。
    • 好的,现在告诉你,你将哪个模型放入articulo和sth模板变量中?
    【解决方案2】:

    尝试使用 ifequal

    {% ifequal articulo.Tipos sth.tipo|slugify %}
        Equal
    {% else %}
        Not Equal
    {% endifequal %}
    

    我还建议检查两者的数据类型!

    编辑:

    您可以使用添加过滤器将 str 强制转换为 int

    {% for item in numItems|add:"0" %}
    

    https://docs.djangoproject.com/en/dev/ref/templates/builtins/#add

    使用 slugify 将 int 强制转换为 str

    {{ some_int|slugify }}
    

    【讨论】:

    • 如果 equal 也不起作用,sth.tipo 是外键字段,articulo.Tipos 是 char 字段
    • 啊!你去吧。您正在将整数与字符进行比较。尝试在你的视野中投射它
    • 对不起,但我不明白如果它们存储相同的值,我怎么能比较:S
    • 我的意思是如何在 if 中使用 slugify ?
    • 试试这个:{% ifequal articulo.Tipos sth.tipo|slugify %}
    【解决方案3】:

    这是你必须做的

    {% if articulo.id == sth.tipo.id %}
       Equal
    {% else %}
       Not Equal
    {% endif %}
    

    sth.tipo 实际上是一个对象,您正在将字符与对象进行比较。您在管理面板中看到相同值的原因是因为您在 TiposOpciones 模型中使用过

    def __str__(self):
        return self.Tipos
    

    这会返回 Tipos 字符串值,但实际上 sth.tipo 是对象。尝试在控制台中打印tipo值,然后它会显示类似

    Productous Object(id)
    

    这是对象,因此在您的情况下,字符(Tipos)正在与 TiposOpciones 的对象(tipos)进行比较。您希望将其与 id 进行比较,因为一旦您拥有主键,它就是主键,您可以使用任何其他字段值对于那个例子

    【讨论】:

      猜你喜欢
      • 2015-06-20
      • 1970-01-01
      • 2017-12-26
      • 2013-08-25
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 2011-06-29
      • 1970-01-01
      相关资源
      最近更新 更多