Django:将数据从模型转换为视图的最佳方法

时间:2017-02-07 12:30:25

标签: python django

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

  • 将电话号码从int 71234567689转换为“+7(123)456789”
  • 用空格显示长价:“7 000 000”而不是“7000000”
  • 从“街道”,“房子”等几个字段构建完整地址(逻辑如果相当复杂,有几个if-else-s)

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

你可以使用Django休息框架

doc(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)

定义自定义序列化程序/字段后 您只需要指定用于表示数据的序列化程序

答案 1 :(得分:1)

如果您使用的是Django Rest Framework,那么您只需使用serializers即可。但我不认为这是一个案例。你想要完成的东西看起来与django forms的角色非常相似,但是它们只用于(传统上)用于保存/更新模型,即POST请求。现在,您可以定义一个用于过滤/渲染的新类,并在视图中使用它,或者继续使用django表单,这将自动为不同的字段提供基本清理。