Модели Django - проблема с импортом - PullRequest
8 голосов
/ 15 апреля 2011

Я реорганизовал свои файлы моделей в модуль - таким образом, намного проще поддерживать код, так как он немного вырос.

Забавно то, что он не будет работать для одногоиз классов, которые ссылаются на другой класс, который ссылается на первый в свою очередь:

UPD: циклические ссылки сбивают с толку Python, и это является причиной проблемы.Это легко исправить, когда вы только ссылаетесь на другие модели из вашего определения модели .Однако у Picture есть методы, которые ссылаются на класс paperType и наоборот - как это можно исправить?

Вот класс Picture:

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

теперь это то, что я получаю в оболочке при попытке импортировать изображение:

>>> 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
>>>

можно ли это вылечить?:)

1 Ответ

26 голосов
/ 15 апреля 2011

Чтобы избежать циклического импорта, укажите модель FK в виде строки, например,

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

или

collection = models.ForeignKey('myapp.Collection') # Collection is in another app
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...