【问题标题】:Django models - problem importingDjango 模型 - 导入问题
【发布时间】:2011-08-06 05:29:41
【问题描述】:

我已将我的模型文件重构为一个模块 - 这样维护代码就容易多了,因为它已经增长了很多。

有趣的是,它不适用于其中一个类引用另一个类,而另一个类又引用了第一个类:

UPD:循环引用使 python 感到困惑,这就是导致问题的原因。当您从您的模型定义中引用其他模型时,这很容易解决。但是,Picture 具有引用 paperType 类的方法,反之亦然 - 如何解决此问题?

这是班级图片:

from django.db import models
from django.utils import simplejson
from picviewer.models import Collection, ImageSizeRatio, printSize

class Picture(models.Model):
    name = models.TextField(null=False,blank=False,unique=False)
    collection = models.ForeignKey(Collection)
    popularity = models.IntegerField(default=0,unique=False)
    isPurchasable = models.BooleanField(default=False)
    allowBuyExclusive = models.BooleanField(default=False)
    basePrice = models.DecimalField(decimal_places=2,max_digits=8)
    imageSizeRatio = models.ForeignKey(ImageSizeRatio)
    imageThumbnail = models.FileField(upload_to='pictures')
    imagePreview = models.FileField(upload_to='pictures')
    imageSmall = models.FileField(upload_to='pictures')
    imageNormal = models.FileField(upload_to='pictures')
    imageLarge = models.FileField(upload_to='pictures')
    imageHuge = models.FileField(upload_to='pictures')
    allowedPrintSize = models.ManyToManyField(printSize)

这是它引用的 printSize 类 - 您会看到它调用图片函数来围绕指定 printSize 的图片进行一些数学运算:

from django.db import models
from picviewer.models import paperType
from picviewer.models import Picture

class printSize (models.Model):
    name = models.CharField(null=False,blank=False,unique=True,max_length=60)
    width = models.IntegerField(null=False,blank=False)
    height = models.IntegerField(null=False,blank=False)
    allowedPaperType = models.ManyToManyField(paperType)
    #isActive = models.NullBooleanField(null=True, default=None)

    def json(self, picture_id, base_price):
        sizes_selector = printSize.objects.filter(picture__id = picture_id)
        sizes = list()
        for size in sizes_selector:
            papers = list()
            for paper in size.allowedPaperType.all():
                cost_for_paper = Picture.objects.get(id=picture_id).calculatePrice(paper.id,size.id)
                p = dict(id = paper.id,
                         name = paper.name,
                         description = paper.description,
                         price = paper.pricePerSqMeter.__str__(),
                         cost = "%.2f" % cost_for_paper)
                papers.append(p)
            s = dict(id = size.id,
                     name = size.name,
                     width = size.width,
                     height = size.height,
                     allowedPapers = papers)
            sizes.append(s)
        return sizes

现在这是我在 shell 中尝试导入图片时得到的结果:

>>> from picviewer.models import Picture
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "D:\~Sasha\eclipse_workspace\zavalen\picviewer\models\Picture.py", line 4, in <module>
    from picviewer.models import Collection, ImageSizeRatio, printSize
  File "D:\~Sasha\eclipse_workspace\zavalen\picviewer\models\printSize.py", line 4, in <module>
    from picviewer.models import Picture
ImportError: cannot import name Picture
>>>

我能治好吗? :)

【问题讨论】:

标签: python django class django-models


【解决方案1】:

为避免循环导入,请将 FK 模型指定为字符串,例如

collection = models.ForeignKey('Collection') # Collection is in the same module

collection = models.ForeignKey('myapp.Collection') # Collection is in another app

【讨论】:

  • +1,被打败了。请参阅the docs,其中明确提到了这种情况。
  • 如果模型定义中只有对其他模型的引用,它确实有效。如何从类的方法中引用其他模型?
  • 在您给出的示例中,您应该能够从图片模型中删除from picviewer.models import Collection, ImageSizeRatio, printSize 行,从而删除循环引用。然后 printSize 模型应该可以毫无问题地导入图片。
  • 是的,但是我的 Picture 类有 def something(): return printSize().json(self.id,self.basePrice) - 我该怎么做呢?
  • 哦,好的。一种选择是在函数中导入模块而不是整个文件,例如def something(): from picviewer.models import printSize; return printSize().json(self.id, self.basePrice)。可能还有其他方法可以做到这一点,但为时已晚,我的大脑运作不佳。我建议使用示例函数更新问题以准确显示您的意思,并查看出现的其他建议。
猜你喜欢
  • 1970-01-01
  • 2011-05-21
  • 2020-07-11
  • 1970-01-01
  • 1970-01-01
  • 2022-06-14
  • 1970-01-01
相关资源
最近更新 更多