2015-10-23 203 views
1

我有两个模型Stage和Application。我收到类似这样的错误:嵌套序列化器Django Rest框架

异常类型:导入错误

异常值:不能导入名称ApplicationSerializer

异常位置:/用户/ jojjen /工作区/ indusaction/VMS /分期/串行.py in,第7行

我在猜测这个错误是由于序列化程序中的循环导入引起的。但我不知道如何解决这个问题。

如果我从删除ApplicationSerializer进口StageSerializer,它的工作原理。但是我需要在我构建的模板中访问舞台应用程序的某些属性。

以下是代码:

阶段/ models.py:

from django.db import models 

from core.models import TimeStampedModel 

from applications.models import Application 

from authentication.models import Account 


class Stage(TimeStampedModel): 
    name = models.CharField(max_length=20) 

    application = models.ForeignKey(Application, null=True, related_name='stages') 

    assignee = models.ForeignKey(Account, null=True) 

    def __unicode__(self): 
     return self.name 

应用/ models.py:

from django.db import models 

from core.models import TimeStampedModel 

from organizations.models import Organization 
from authentication.models import Account 


class Application(TimeStampedModel): 
    title = models.CharField(max_length=30, unique=True) 
    details = models.TextField() 
    archived = models.BooleanField(default=False) 

    organization = models.ForeignKey(Organization, null=True) 

    users = models.ManyToManyField(Account, related_name='applications') 

    creator = models.ForeignKey(Account, null=True) 

    def __unicode__(self): 
     return self.title 

阶段/ serializers.py

from rest_framework import serializers 

from stages.models import Stage 

from authentication.serializers import AccountSerializer 

from applications.serializers import ApplicationSerializer 


class StageSerializer(serializers.ModelSerializer): 
    assignee = AccountSerializer(read_only=True, required=False) 
    application = ApplicationSerializer(read_only=True, required=False) 

    class Meta: 
     model = Stage 
     fields = ('id', 'name', 'assignee', 'created_at', 'updated_at', 
        'application',) 
     read_only_fields = ('created_at', 'updated_at', 'assignee', 
          'application',) 

     def get_validation_exclusions(self, *args, **kwargs): 
      exclusions = super(StageSerializer, 
           self).get_validation_exclusions() 

      return exclusions + ['assignee', 'application'] 

applications/serializers.py:

from rest_framework import serializers 

from applications.models import Application 

from organizations.serializers import OrganizationSerializer 
from authentication.serializers import AccountSerializer 
from stages.serializers import StageSerializer 
from applicants.serializers import ApplicantSerializer 


class ApplicationSerializer(serializers.ModelSerializer): 
    organization = OrganizationSerializer(read_only=True, required=False) 
    creator = AccountSerializer(read_only=True, required=False) 
    users = AccountSerializer(read_only=True, required=False, many=True) 
    stages = StageSerializer(read_only=True, required=False, many=True) 
    applicant_set = ApplicantSerializer(read_only=True, required=False, many=True) 

    class Meta: 
     model = Application 

     fields = ('id', 'title', 'details', 'organization', 'stages', 
        'creator', 'archived', 'users', 'applicant_set') 
     read_only_fields = ('id', 'organization', 'users', 'applicant_set', 
          'created_at', 'updated_at', 'stages') 

    def get_validation_exclusions(self, *args, **kwargs): 
     exclusions = super(ApplicatiionSerializer, 
          self).get_validation_exclusions() 

     return exclusions + ['organization', 'users', 'creator', 'stage_set', 'applicant_set'] 

回答

1

此代码无效,您不能有循环导入和依赖关系。一般来说,这对Python的Django Rest Framework来说并非如此。你必须改变你的设计来消除这种循环依赖。

任何语言的循环依赖都是无限递归。

看图书馆 - https://github.com/heywbj/django-rest-framework-recursive/tree/master/rest_framework_recursive。这可以用来模拟树状或链接列表中的循环依赖。

但我仍然建议你考虑你的设计。 Read why circular dependency is a sign of poor design. 如果这是不可能的,把相互依赖的组件放入同一个模块。

+0

我改变了我的设计,以消除循环依赖:) – Jojjen

相关问题