【问题标题】:return a custom data for a field in django ORM在 django ORM 中返回一个字段的自定义数据
【发布时间】:2021-08-29 21:38:34
【问题描述】:

我想查询一个具有 Char 字段的对象,在每次调用对象时,我将返回相应值的正确数据类型。

例如,

class A(models.Model):
    tweet = models.CharField(max_length=120, default=dict)

所以,

>>> a = A.objects.first()
>>> a.tweet
>>> {'x': '1'}


这应该返回,而不是:

{'x': 1}

出于某种原因,我不想按照我期望的查询方式保存该字段。

提前致谢

【问题讨论】:

  • 您确定这是CharField,而不是JsonField?在这种情况下,a.tweet 的结果应该始终是字符串,而不是字典。
  • 这是一个字符串,和 {"x": "1"} 注意双引号一样。你的意思可能是JSONField。但是,对于您的实现,您需要通过 json.loads 解析此 JSON 字符串。
  • @AhmedI.Elsayed 挑战在于每次调用这个对象时我都必须解析它。我想编写一个自定义模型管理器并为该字段稍微更改查询集。但这似乎对我不起作用:(
  • @twingo 这基本上就是威廉和我提到的JSONField 的工作原理。

标签: django django-models django-orm


【解决方案1】:

您可以make a custom form field 并在返回之前使用它来更改列数据。

class CustomCharField(models.CharField):

    def to_python(self, value):
        if isinstance(value, str):
            value = json.loads(value)
            if isinstance(value, dict):
                for key, val in value.items():
                    if isinstance(value, str) and value.isdigit():
                        value[key] = int(value)

        return value

to_python 函数中,您可以在从 Django orm 返回之前更改值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多