Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:将数据从模型转换为视图的最佳方式_Python_Django - Fatal编程技术网

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

Python Django:将数据从模型转换为视图的最佳方式,python,django,Python,Django,MyDjango应用程序在表视图中显示数据库中的对象。问题是这些对象(模型)相当复杂:它们有50多个字段。几乎每个字段我都要做一些格式化: 将国际电话号码71234567689转换为“+7(123)456789” 显示带空格的长价格:“7000 000”而不是“7000000” 从几个字段(如“street”、“house”等)构造完整地址(如果逻辑非常复杂,有几个if-else-s) 等等 Django模板语言有几个用于简单情况的有用标记,但我想在一般情况下(如我的情况)不适合用于严重的格

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

  • 将国际电话号码71234567689转换为“+7(123)456789”
  • 显示带空格的长价格:“7000 000”而不是“7000000”
  • 从几个字段(如“street”、“house”等)构造完整地址(如果逻辑非常复杂,有几个if-else-s)
  • 等等
Django模板语言有几个用于简单情况的有用标记,但我想在一般情况下(如我的情况)不适合用于严重的格式设置

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

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

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


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

您可以使用Django rest框架

文档()中的示例

类颜色(对象):
"""
RGB颜色空间中表示的颜色。
"""
def __;初始(自身、红色、绿色、蓝色):
断言(红色>=0,绿色>=0,蓝色>=0)
断言(红色<256,绿色<256,蓝色<256)
self.red,self.green,self.blue=红,绿,蓝
类ColorField(serializers.Field):
"""
颜色对象被序列化为“rgb(#、#、#)符号”。
"""
def至_表示(自身、obj):
返回“rgb(%d,%d,%d)”%(对象红色、对象绿色、对象蓝色)
def至_内部_值(自身、数据):
data=data.strip('rgb(').rstrip('))
红、绿、蓝=[int(col)表示数据中的col.split(',')]
返回颜色(红色、绿色、蓝色)
定义自定义序列化程序/字段后。

如果您使用的是
Django Rest Framework
,则只需指定要使用哪个序列化程序来表示数据,就可以简单地使用
序列化程序。但我认为情况并非如此。您想要完成的任务似乎与django
表单的角色非常相似,但它们仅用于(传统上)保存/更新模型,即POST请求。现在,您可以定义一个用于过滤/渲染的新类并在视图中使用它,或者直接使用django表单,它将自动为不同的字段提供基本的清理。

我不使用djang rest框架,我认为这有点过分了。UI是只读的,所以我只需要模型到视图的转换。表单也不适合:一些转换非常复杂:取该字段,检查是否满足条件,否则检查该字段,等等。我想我将创建一个独立类,并在查询集上迭代以将模型转换为此类。但我还是不喜欢:(当然,只要创建一个渲染器类,如果您想使用一些内置功能,您可以从表单基类继承。
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)