gpt4 book ai didi

python - 嵌套序列化器 Django Rest Framework

转载 作者:行者123 更新时间:2023-12-01 04:24:37 25 4
gpt4 key购买 nike

我有两个模型阶段和应用程序。我收到这样的错误:

Exception Type: ImportError

Exception Value: cannot import name ApplicationSerializer

Exception Location: /Users/jojjen/workspace/indusaction/vms/stages/serializers.py in , line 7

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

如果我从 StageSerializer 中删除 ApplicationSerializer 导入,它就会起作用。但我需要在我正在构建的模板中访问阶段应用程序的某些属性。

代码如下:

阶段/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

阶段/序列化器.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']

最佳答案

此代码无效,您不能有循环导入和依赖项。一般来说,对于 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.如果不可能,请将相互依赖的组件放入同一模块中。

关于python - 嵌套序列化器 Django Rest Framework,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33299270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com