Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django模型-导入问题_Python_Django_Class_Django Models - Fatal编程技术网

Python Django模型-导入问题

Python Django模型-导入问题,python,django,class,django-models,Python,Django,Class,Django Models,我已经将我的模型文件重构成一个模块——这样,代码的维护就容易多了,因为它已经增长了很多 有趣的是,它不适用于引用另一个类的其中一个类,该类在轮到它时引用了第一个类: UPD:循环引用混淆了python,这就是问题的原因。如果仅从模型定义中引用其他模型,则很容易解决此问题。然而,Picture有引用paperType类的方法,反之亦然-如何修复这个问题 这是班级照片: from django.db import models from django.utils import simplejson

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

有趣的是,它不适用于引用另一个类的其中一个类,该类在轮到它时引用了第一个类:

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类-您可以看到它调用Picture函数来对指定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
>>>
>>从picviewer.models导入图片
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“D:\~Sasha\eclipse\u workspace\zavalen\picviewer\models\Picture.py”,第4行,在
从picviewer.models导入集合、ImageSizeRatio、printSize
文件“D:\~Sasha\eclipse\u workspace\zavalen\picviewer\models\printSize.py”,第4行,在
从picviewer.models导入图片
导入错误:无法导入名称图片
>>>

我能治好这个吗?:)

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

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


我猜python会被循环引用弄糊涂——但是如果它们两个需要相互使用——有没有办法解决这个问题?为什么在
TextField
上有
null=True
?反对它。+1,被打败。请参阅明确提及此情况的示例。如果模型定义中仅引用了其他模型,则此示例确实有效。如何从类的方法中引用其他模型?在您给出的示例中,您应该能够从picviewer.models导入集合、ImageSizeRatio、printSize行中删除图片模型中的
,从而删除循环引用。然后,printSize模型应该可以毫无问题地导入图片。是的,但是我的图片类有def something():return printSize().json(self.id,self.basePrice)-我该怎么做呢?哦,好的。一个选项是在函数中导入模块,而不是整个文件,例如
def something():from picviewer.models import printSize;返回printSize().json(self.id,self.basePrice)
。也许还有其他方法可以做到这一点,但时间已经很晚了,而且我的大脑功能不太好。我建议使用示例函数更新问题,以准确显示您的意思,并查看出现的其他建议。
collection = models.ForeignKey('myapp.Collection') # Collection is in another app