如何将django模型映射到python数据类

如何将django模型映射到python数据类,python,django,django-models,python-dataclasses,Python,Django,Django Models,Python Dataclasses,github中曾经有一个项目,允许您将django模型映射到python数据类,但现在已经不存在了。您仍然可以使用回程机器进行检查: 我试图找到另一种将django模型映射到python数据类的方法,但似乎找不到任何类似的项目解决方案1(首选方法,支持自定义数据类型,双向映射): 在这里检查我的答案 解决方案2: 可以使用在此处实现的decorator完成此操作: from django.db import models from dataclasses import dataclass

github中曾经有一个项目,允许您将django模型映射到python数据类,但现在已经不存在了。您仍然可以使用回程机器进行检查:

我试图找到另一种将django模型映射到python数据类的方法,但似乎找不到任何类似的项目

解决方案1(首选方法,支持自定义数据类型,双向映射): 在这里检查我的答案

解决方案2: 可以使用在此处实现的decorator完成此操作:

from django.db import models
from dataclasses import dataclass

# you can copy this decorator and use it or implement your own
def with_dataclass_mapper(dataclass):
    def wrapper(cls):
        def mapper(self):
            dataclass_kwargs = {}
            for field in dataclass.__dataclass_fields__:
                dataclass_kwargs[str(field)] = getattr(self, str(field))
            return dataclass(**dataclass_kwargs)
        # add 'map' method to class
        setattr(cls, 'map', mapper)
        return cls
    return wrapper
例子: 注意:
  • 此解决方案要求在模型中也定义数据类字段
  • 我只使用字符串字段测试了这个解决方案
@dataclass
class MyDataclass:
    field1: str
    field2: str

@with_dataclass_mapper(MyDataclass)
class MyModel(models.Model):
    field1 = models.CharField(default="", max_length=255)
    field2 = models.CharField(default="", max_length=255)

modelInstance = MyModel(field1="foo", field2="bar")
myDataclassInstance = modelInstance.map()