草庐IT

python - 无法从 django rest-framework 中的其他序列化程序导入序列化程序?

coder 2023-08-27 原文

问题

我有 2 个模型、线索和注释。我希望潜在客户能够拥有 1 个或多个注释。我使用了通用外键,因为我想为 future 做计划,并且可以分配一个注释来说明一个人或一个 session 。

按照 django rest framework 和 Rest Framework Generic Relations 的说明,我正在尝试从另一个序列化程序导入一个序列化程序,以使反向关系成为可能。

错误

我无法在两个文件中导入序列化器(从另一个调用一个序列化器),因为我得到:

File "/Users/james/Documents/UtilityCRM-Server/crm/leads/urls.py", line 2, in <module>
    from leads import views
  File "/Users/james/Documents/UtilityCRM-Server/crm/leads/views.py", line 11, in <module>
    from leads.serializers import LeadSerializer
  File "/Users/james/Documents/UtilityCRM-Server/crm/leads/serializers.py", line 4, in <module>
    from notes.serializers import NoteSerializer
  File "/Users/james/Documents/UtilityCRM-Server/crm/notes/serializers.py", line 6, in <module>
    from leads.serializers import LeadSerializer
ImportError: cannot import name LeadSerializer

这很奇怪,因为如果我打开 django shell 并运行以下命令,它可以让我将它们全部导入:

from leads.serializers import LeadSerializer
from notes.serializers import NotesSerializer
from callbacks.serializers import CallbackSerializer

如有任何帮助,我们将不胜感激!

代码

这是我的设置文件的已安装应用部分:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 3rd Party Apps
    'rest_framework',
    'generic_relations',
    # My Apps
    'leads.apps.LeadsConfig',
    'callbacks.apps.CallbacksConfig',
    'notes.apps.NotesConfig',
]

notes/models.py

from __future__ import unicode_literals

from django.db import models
from django.utils import timezone
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType

class Note(models.Model):
    author = models.ForeignKey('auth.User')
    title = models.CharField(max_length=100)
    text = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)

    # Relations
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    note_object = GenericForeignKey('content_type', 'object_id')

    def __str__(self):
        return self.title

leads/models.py

from __future__ import unicode_literals

from django.db import models
from django.contrib.contenttypes.fields import GenericRelation
from django.utils import timezone

from notes.models import Note
from callbacks.models import Callback

GAS = 'G'
ELECTRICITY = 'E'
LEAD_TYPE_CHOICES = (
    (GAS, 'Gas'),
    (ELECTRICITY, 'Electricity'),
)

# Create your models here.
class Lead(models.Model):

    author = models.ForeignKey('auth.User')
    type = models.CharField(
        max_length=1,
        choices=LEAD_TYPE_CHOICES,
        default=GAS,
    )
    business_registration_number = models.IntegerField(max_length=20)
    business_name = models.CharField(max_length=50)
    mpan = models.IntegerField(max_length=21)
    supplier = models.CharField(max_length=45)
    contract_length = models.IntegerField(max_length=2)
    contract_start_date = models.DateField()
    contract_end_date = models.DateField()
    address_line_1 = models.CharField(max_length=45)
    address_line_2 = models.CharField(max_length=45)
    address_line_3 = models.CharField(max_length=45)
    address_city = models.CharField(max_length=45)
    address_county = models.CharField(max_length=45)
    address_postcode = models.CharField(max_length=10)
    contact_title = models.CharField(max_length=45)
    contact_first_name = models.CharField(max_length=45)
    contact_middle_name = models.CharField(max_length=45)
    contact_last_name = models.CharField(max_length=45)
    contact_telephone = models.IntegerField(max_length=11)
    contact_email = models.EmailField(max_length=60)
    created_date = models.DateTimeField(default=timezone.now)

    # Relations
    assigned_to = models.ForeignKey('auth.User', related_name='+')
    #from_batch = models.ForeignKey('data_batch.DataBatch', related_name='+')
    #callbacks = GenericRelation(Callback)
    notes = GenericRelation(Note)

    class Meta:
        ordering = ('contract_end_date', 'business_name',)

    def __str__(self):
        return self.business_name

我有 2 个序列化程序:

leads/serializers.py

from rest_framework import serializers
from leads.models import Lead, LEAD_TYPE_CHOICES

from notes.serializers import NoteSerializer

class LeadSerializer(serializers.ModelSerializer):
    notes = NoteSerializer(many=True, read_only=True)

    class Meta:
        model = Lead
        fields = (
            'id',
            'business_name',
            'business_registration_number',
            'supplier',
            'contract_length',
            'contract_start_date',
            'notes'
            )

notes/serializers.py

from generic_relations.relations import GenericRelatedField
from rest_framework import serializers
from notes.models import Note

from leads.models import Lead
from leads.serializers import LeadSerializer

from callbacks.models import Callback
from callbacks.serializers import CallbackSerializer


class NoteSerializer(serializers.ModelSerializer):
    """
    A `Note` serializer with a `GenericRelatedField` mapping all possible
    models to their respective serializers.
    """
    note_object = GenericRelatedField({
        Lead: LeadSerializer(),
        Callback: CallbackSerializer()
    })

    class Meta:
        model = Note
        fields = (
            'id',
            'author',
            'title',
            'text',
            'created_date',
            'note_object',
            )

最佳答案

正如我之前在评论中提到的,我相信这是由于 Python 中的循环(循环)导入造成的。 当您在模型中声明相关字段并且某些模型尚未实例化时,尤其会发生这种情况。

在这种情况下,当您执行程序时,它会尝试导入 LeadSerializer,这需要导入 NoteSerializer,即需要导入 LeadSerializer,这需要导入 NoteSerializer...看看这是怎么回事?

你的堆栈轨迹说明了一切:

from leads.serializers import LeadSerializer

from notes.serializers import NoteSerializer

from leads.serializers import LeadSerializer

正在生成ImportError:无法导入名称 LeadSerializer

我为解决此问题所做的工作是在单个文件中声明所有序列化程序。因此,您有两个选择:

  1. LeadSerializer 移动到 notes/serializers.py
  2. NoteSerializer 移动到 leads/serializers.py

这不是解决这个问题的最优雅的方法,但它已经达到了目的。


下面的部分没有提供关于如何解决这个问题的进一步解释,而是对这个问题的观察。

也许 Django 和 DRF 将来可以提供避免这种情况的方法,例如将序列化程序声明为

note_object = GenericRelatedField({
    Lead: 'leads.serializers'.LeadSerializer,
    Callback: CallbackSerializer()
})

notes = 'notes.serializers'.NoteSerializer(many=True, read_only=True)

关于python - 无法从 django rest-framework 中的其他序列化程序导入序列化程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42046550/

有关python - 无法从 django rest-framework 中的其他序列化程序导入序列化程序?的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  3. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  4. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  5. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  6. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  7. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  8. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  9. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  10. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

随机推荐