Django 为什么这个queryset过滤器会无声地崩溃?
基本上,我要做的是过滤掉查询中的公司,这段代码是大量调试的结果。我们已将其简化为尽可能简单的形式,无法找出“company.objects.filter(pk=“E0433CAE-1756-11E1-A97B-7071BC08AB6F”)中的company失败的原因。在其他任何地方,它都能完美工作:s Autovification是自动嵌套字典。看 要运行的代码:Django 为什么这个queryset过滤器会无声地崩溃?,django,django-models,Django,Django Models,基本上,我要做的是过滤掉查询中的公司,这段代码是大量调试的结果。我们已将其简化为尽可能简单的形式,无法找出“company.objects.filter(pk=“E0433CAE-1756-11E1-A97B-7071BC08AB6F”)中的company失败的原因。在其他任何地方,它都能完美工作:s Autovification是自动嵌套字典。看 要运行的代码: def run_code(code, query_dict): code = code.replace('\r\n', '\
def run_code(code, query_dict):
code = code.replace('\r\n', '\n')
import jmsdirectory.advert.models
import jmsdirectory.boughtin.models
import jmsdirectory.contacts.models
import jmsdirectory.generic.models
import jmsdirectory.joinerysoft.models
import jmsdirectory.scheduler.models
import jmsdirectory.suppliers.models
# g = {'__builtins__': False }
# try:
print "WOOPS"
# print g
print query_dict
class AutoVivification(dict):
print "AutoVivification: 1"
"""Implementation of perl's autovivification feature."""
def __getitem__(self, item):
try:
return dict.__getitem__(self, item)
except KeyError:
value = self[item] = type(self)()
return value
print "AutoVivification: 69"
models = AutoVivification()
print "AutoVivification: 71"
for company in Company.objects.filter(pk="E0433CAE-1756-11E1-A97B-7071BC08AB6F"):
print "AutoVivification: 74"
for address in Address.objects.filter(company=query_dict['company']).exclude(allow_download=0):
print "AutoVivification: 76"
for contact in Contact.objects.filter(address=address.uuid).exclude(allow_download=0):
print "AutoVivification: 78"
for supplier in Supplier.objects.filter(company=query_dict['company']):
print "AutoVivification: 80"
for supplies in Supplies.objects.filter(supplier=supplier.uuid):
print "AutoVivification: 82"
models[company][address][contact][supplier] = supplies
print "AutoVivification: 84"
print models
print "Rage!"
result = models
# exec code in locals()
print "MEH!"
# except:
# print "Error in query set"
# print traceback.print_exc()
# return False
return result
输出:
Django version 1.2.7, using settings 'jmsdirectory.settings'
Development server is running at http://127.0.0.1:8002/
Quit the server with CTRL-BREAK.
[21/May/2012 12:22:18] "POST /transfer/server/ HTTP/1.0" 200 162
[21/May/2012 12:22:18] "POST /transfer/server/ HTTP/1.0" 200 531
[21/May/2012 12:22:18] "POST /transfer/server/ HTTP/1.0" 200 162
1
2
3
4
5
6
7
8
9
WOOPS
{'company': u'E0433CAE-1756-11E1-A97B-7071BC08AB6F', 'contact': u'E047B1A8-1756-11E1-A97B-7071BC08AB6F', 'address': u'E0452488-1756-11E1-A97B-7071BC08AB6F'}
AutoVivification: 1
AutoVivification: 69
AutoVivification: 71
[21/May/2012 12:22:18] "POST /transfer/server/ HTTP/1.0" 200 129
公司模式:
class Company(models.Model):
uuid = UUIDField(primary_key=True)
name = models.CharField(null=True, blank=True,max_length=255,verbose_name=_('Company Name'))
internal_name = models.CharField(null=True, blank=True,max_length=255,verbose_name=_('Internal Name'))
reference = models.CharField(null=True, blank=True,max_length=255,verbose_name=_('Reference'))
company_status = models.ForeignKey(CompanyStatus, null=True, db_column='company_status_uuid',verbose_name=(_('Company Status')), serialize=False)
vat_number = models.CharField(null=True, blank=True,max_length=255,verbose_name=(_('Vat Number')))
registration_number = models.CharField(null=True, blank=True,max_length=255,verbose_name=(_('Company Number')))
discount = models.FloatField(null=True, blank=True)
notes = models.TextField(null=True, blank=True,max_length=255)
jms_code = models.TextField(null=True, blank=True,max_length=255)
logo = models.TextField(null=True, blank=True,max_length=255)
date_created = models.DateTimeField(null=True, blank=True, auto_now_add=True,verbose_name=_('Date Time'), serialize=False)
date_modified = models.DateTimeField(null=True, blank=True, auto_now=True,verbose_name=_('Date Time Updated'), serialize=False)
hidden = models.NullBooleanField(null=True, blank=True,default=0, serialize=False)
user = UserField(null=True, blank=True, serialize=False)
allow_download = models.NullBooleanField()
is_modified = ModifiedField(serialize=False)
companyid = models.IntegerField(null=True, blank=True, serialize=False)
seqno = models.IntegerField(null=True, blank=True, serialize=False)
def __unicode__(self):
return self.name
def advertiser_uuid(self):
uuid = self.uuid
today = date.today()
from jmsdirectory.advert.models import Advertiser
a=Advertiser.objects.filter(company=self,start_date__lte=today,end_date__gte=today)
if len(a) > 0:
return a[0].uuid
else:
return ''
def advertiser(self):
if self.advertiser_uuid() != '':
return True
else:
return False
def get_sequence (self) :
if self.seqno is None :
from django.db.models import Max
max = Company.objects.all().aggregate(Max('seqno'))['seqno__max']
if max is None :
self.companyid = 1
else : self.companyid = max + 1
self.seqno = 1
else :
self.seqno += 1
self.save()
return self.companyid, self.seqno
class Meta:
verbose_name_plural = ('Companies')
ordering = ('name',)
db_table = 'company'
固定的:
def run_code(code, query_dict):
code = code.replace('\r\n', '\n')
class AutoVivification(dict):
"""Implementation of perl's autovivification feature."""
def __getitem__(self, item):
try:
return dict.__getitem__(self, item)
except KeyError:
value = self[item] = type(self)()
return value
models = AutoVivification()
companies = Company.objects.filter(pk="E0433CAE-1756-11E1-A97B-7071BC08AB6F")
addresses = Address.objects.filter(company=query_dict['company']).exclude(allow_download=0)
suppliers = Supplier.objects.filter(company=query_dict['company'])
for company in companies:
for address in addresses:
for contact in Contact.objects.filter(address=address.uuid).exclude(allow_download=0):
for supplier in suppliers:
for supply in Supplies.objects.filter(supplier=supplier.uuid):
models[company][address][contact][supplier] = supply
result = models
return result
简单的回答是-它没有崩溃,它只是不返回任何内容,所以您在空集上迭代,因此不会打印任何内容 答案很长: 我会尽力帮你一点忙,但我的第一个建议是把你的问题简化到最基本的层面。例如,使用而不是autovivi类 我还看到了一些其他问题,例如:
用于address.objects.filter中的地址(company=query\u dict['company'])
您试图根据字符串筛选PK,我想您的意思是:
用于address.objects.filter中的地址(company\uuid=query\u dict['company'])
根据您的其他模型判断,我怀疑您最初的疑问应该是:
用于company.objects.filter(uuid=“E0433CAE-1756-11E1-A97B-7071BC08AB6F”)中的公司
同样,您应该修复其他查询:
contact.objects.filter中的联系人(address\uuid=address.uuid)
甚至更好
contact.objects.filter(address=address)中的contact
如果您具有适当的FK关系
然而,正如丹尼尔所暗示的,即使你能做到这一点,这也是非常低效的。你应该利用和。你能进一步简化这个例子并重现这个问题吗?你确定有一家有这种PK的公司存在吗?还要注意的是,当你这样做的时候,它的效率会非常低。你不使用它有什么原因吗?另外,为公司
发布你的模型哦,但它正在崩溃,不管怎样,它至少会打印出一些东西。即使我不希望它打印它,每一行都有打印语句围绕着它,所以我可以在控制台中跟踪执行路径。另一件事,这是/已经使用了许多外键查找。我已经在uuid中硬连线,试图缩小故障的范围。如果它会崩溃,您已经得到了一个异常;它不在循环中打印任何内容的原因是,您正在对一个空集进行迭代。它相当于[]中的i的:print i
这不会打印任何内容,但它是完全有效的Python。那么为什么它不在for循环后打印行呢print“Rage!”
pk也是主键的缩写,所以应该可以正常工作,就像其他地方一样:)