django,python:AttributeError:';非类型';对象没有属性'_meta&x27;
我试图测试我自己用Python编写的update_或create方法,但我遇到了一个错误,我用谷歌搜索了一下,没有找到答案。 以下是源代码:django,python:AttributeError:';非类型';对象没有属性'_meta&x27;,python,django,Python,Django,我试图测试我自己用Python编写的update_或create方法,但我遇到了一个错误,我用谷歌搜索了一下,没有找到答案。 以下是源代码: class ListingManager(models.Manager):#manage the creating/editting/deleting of listings def update_or_create_listing(self, listing_attributes, scraped = False, **extra_attribu
class ListingManager(models.Manager):#manage the creating/editting/deleting of listings
def update_or_create_listing(self, listing_attributes, scraped = False, **extra_attributes):
from sitebot.tasks import scrape_listing_url
keys = listing_attributes.keys()
print keys
site = Site.objects.get(id = listing_attributes['site_id'])
if 'sku' in keys and 'site_id' in keys and 'url' in keys:
#create a listing if no such listing exists
#SiteUrl.objects.get_or_create(href )
listing, created = self.get_or_create(sku = listing_attributes['sku'], site = site, defaults = {'url': listing_attributes['url']})
dynamo_db_listing_attributes = []
if len(keys)> 3:
dynamo_db_listing_attributes = listing.create_or_update_attributes(listing_attributes = listing_attributes, **extra_attributes)
if scraped == True and listing.scraped == False: #if the listing is already scraped, update the scraped status
listing.scraped = scraped
listing.save()
if created == True and listing.scraped == False: #if the listing is just created and not scarped yet
scrape_listing_url.delay(listing_id = str(listing.id), sku = listing.sku, listing_url = listing.url, scraper_name = listing.site.scraper.name) # what does delay do?
return listing, listing_attributes
else:
raise KeyError
这是测试代码:
class ListingManagerClassTests(TestCase):
def setUp(self):
#Generate Site for listing
site = models.Site()
#Generating Site requires ForeignKey Country
country_for_site = models.Country()
country_for_site.save()
#Generating Site requires ForeignKey Scraper
scraper_for_site = models.Scraper()
scraper_for_site.scrapes_per_day = 1
scraper_for_site.max_results = 10
scraper_for_site.save()
site.country = country_for_site
site.scraper = scraper_for_site
site.name = "siteforListingMangerTest"
site.save()
def test_create_listing(self):
"""update_or_create_listing should return the created listing"""
lm = models.ListingManager()
site = models.Site.objects.get(name="siteforListingMangerTest")
listing_attributes = {'sku':'123456','site_id':site.id,
'url':'www.aaa.com'}
#Create the new listing
created_listing, created_listing_attributes = lm.update_or_create_listing(listing_attributes,False)
#check if the retreived listing is the right one
assertEqual(created_listing.sku, '123456')
assertEqual(created_listing.site, site)
assertEqual(created_listing.url,'www.aaa.com')
错误是:
ERROR: test_create_listing (sitebot.tests.ListingManagerClassTests)
update_or_create_listing should return the created listing
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/wx2228/Desktop/BestBot/bestbot/sitebot/tests.py", line 35, in test_create_listing
created_listing, created_listing_attributes = lm.update_or_create_listing(listing_attributes,False)
File "/home/wx2228/Desktop/BestBot/bestbot/sitebot/models.py", line 90, in update_or_create_listing
listing, created = self.get_or_create(sku = listing_attributes['sku'], site = site, defaults = {'url': listing_attributes['url']})
File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py", line 127, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 402, in get_or_create
lookup, params = self._extract_model_params(defaults, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 457, in _extract_model_params
for f in self.model._meta.fields:
AttributeError: 'NoneType' object has no attribute '_meta'
清单的源代码:
class Listing(models.Model):#representing the listing of an product
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
dynamoDB_connection = DynamoDBConnection(region=RegionInfo(name='us-west-2', endpoint='dynamodb.us-west-2.amazonaws.com'))
listings_dynamo_table = Table(table_name = 'sitebot_listings', connection= dynamoDB_connection)
sku = models.CharField(max_length=50)
site = models.ForeignKey(Site)
url = models.CharField(max_length=200, null = True)
scraped = models.BooleanField(default = False)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
objects = ListingManager()
Python试图在self.model中找到字段_meta。当它说NoneType没有该属性时,意味着self.model在您到达该行的点处为None。您必须回溯代码,看看为什么此时它的值为“无”。实例化ListingManager会直接阻止查询引擎查找底层对象 您可以通过替换以下行来解决此问题:
lm = models.ListingManager()
lm = Listing.objects
用这句话:
lm = models.ListingManager()
lm = Listing.objects
(或者可能)
无论如何,您需要通过模型本身引用管理器,否则查询管理器将丢失
它应该可以工作(我刚刚花了半天时间解决了一个类似的问题。我一定很喜欢Django magic错误消息;)当我重命名一个表并为其设置另一个表的外键时,我就遇到了这种情况
在2次迁移中使用它,它应该可以工作;) 您有
列表
型号吗?如果是,您能否提供源代码?您是否尝试过调用Listing.objects.update\u或\u create\u listings
?lm=Listing.objects
谢谢!当我试图模拟与prefetch\u相关的query的某些部分时,这对我来说是有意义的,因为当你从django shell调用ListingManager()
时,你会得到该模型对象的一个新实例。与获取已经属于模型的对象非常不同。这应该是注释