使用Model,ModelManager和ModelSerializer的导入周期

时间:2019-07-12 12:21:14

标签: django django-rest-framework

我正在将Django和Django Rest Framework用于序列化程序。

我有以下情况。

在文件models.py中:

from django.db.models import Manager, Model, CharField

from .serializers import MyModelSerializer


class MyModelManager(Manager):
    serializer_class = MyModelSerializer


class MyModel(Model):
    name = CharField(max_length=64)
    objects = MyModelManager()

在文件serializers.py中:

from rest_framework.serializers import ModelSerializer

from models import MyModel


class MyModelSerializer(ModelSerializer):
    class Meta:
        model = MyModel
        fields = ('name',)

但是,这会导致导入周期,因为两个文件都试图互相导入。我可以通过本地导入来防止这种情况:

class MyModelManager(Manager):
    @property
    def serializer_class(self):
        from ow_articlecode.import_cycle_serializers import MyModelSerializer
        return MyModelSerializer

但是,这感觉像是黑客。什么是打破此导入周期的合适解决方案?

1 个答案:

答案 0 :(得分:0)

一个Manager [Django-doc],具有 no serializer_class字段。实际上,经理对序列化一无所知。管理器用于过滤,创建等对象。

您的models.py应该如下所示:

# app/models.py

from django.db.models import Manager, Model, CharField


class MyModelManager(Manager):
    # no serializer_class
    pass


class MyModel(Model):
    name = CharField(max_length=64)

Model的想法是,它定义了您的业务逻辑,而不是序列化,表单,视图,模板逻辑。