【问题标题】:Django: best way to convert data from model to viewDjango:将数据从模型转换为视图的最佳方法
【发布时间】:2017-02-07 12:30:24
【问题描述】:

我的 django 应用程序在表格视图中显示数据库中的对象。问题是这些对象(模型)非常复杂:有 50 多个字段。几乎每个字段我都必须进行一些格式化:

  • 将电话号码从 int 71234567689 转换为“+7 (123) 456789”
  • 用空格显示多头价格:“7 000 000”而不是“7000000”
  • 从“street”、“house”等多个字段构建完整地址(逻辑如果非常复杂,需要多个 if-else-s)
  • 等等

Django 模板语言有几个用于简单情况的有用标签,但我想在一般情况下(如我的情况)不适合严重格式化。

在模型类中创建@property-s 也不是一个选项,因为问题是关于渲染并且与模型无关。

所以我想我应该在视图中进行转换:为每个 obj 创建 dict,填充转换后的数据并传递给模板。

但是!该模型有很多字段,我不想全部复制它们:) 此外,保留模型结构以在 django 模板(例如,重新组合)和查询集惰性中使用它会很棒。

所以最好的方法是指导 django“如何渲染”。有可能吗?

【问题讨论】:

    标签: python django


    【解决方案1】:

    如果您使用的是Django Rest Framework,那么您可以简单地使用serializers。但我不认为这是一个案例。您想要完成的似乎与 django forms 的角色非常相似,但因此它们仅(通常)用于保存/更新模型,即 POST 请求。现在,您可以定义一个用于过滤/渲染的新类并在您的视图中使用它,或者直接使用 django 表单,它会自动为不同的字段提供基本清理。

    【讨论】:

    • 我不使用 djang-rest-framework,我认为这有点矫枉过正。 UI 是只读的,所以我只需要模型到视图的转换。表单也不适合:几个转换非常复杂:获取该字段,检查是否满足条件,否则检查该字段等等等。我想我将创建一个独立类并遍历查询集以转换模型到这堂课。但我还是不喜欢它:(
    • 当然,只要创建一个渲染器类,如果你想使用一些内置功能,你可以从表单基类继承。
    【解决方案2】:

    你可以使用 Django rest 框架

    文档中的示例 (http://www.django-rest-framework.org/api-guide/fields/)

    class Color(object):
        """
        A color represented in the RGB colorspace.
        """
        def __init__(self, red, green, blue):
            assert(red >= 0 and green >= 0 and blue >= 0)
            assert(red < 256 and green < 256 and blue < 256)
            self.red, self.green, self.blue = red, green, blue
    
    class ColorField(serializers.Field):
        """
        Color objects are serialized into 'rgb(#, #, #)' notation.
        """
        def to_representation(self, obj):
            return "rgb(%d, %d, %d)" % (obj.red, obj.green, obj.blue)
    
        def to_internal_value(self, data):
            data = data.strip('rgb(').rstrip(')')
            red, green, blue = [int(col) for col in data.split(',')]
            return Color(red, green, blue)
    

    在您定义自定义序列化程序/字段之后。
    您只需要指定使用哪个序列化程序来表示您的数据

    【讨论】:

      猜你喜欢
      • 2014-11-27
      • 2019-11-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 2017-07-09
      • 1970-01-01
      • 2018-03-13
      相关资源
      最近更新 更多