2015-09-24 3 views
2

Я пытаюсь протестировать свой собственный метод update_or_create, написанный на Python, но я столкнулся с ошибкой, я разобрал его и не нашел ответа. Вот исходный код:django, python: AttributeError: объект «NoneType» не имеет атрибута «_meta»

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() 
+0

Имеет Вам 'модель Listing'? Если да, можете ли вы предоставить источник? –

+0

@JeanJung только что обновлено – wx2227

+0

Пробовали ли вы вызов 'Listing.objects.update_or_create_listings'? –

ответ

1

Python пытается f ind поле _meta в self.model. Когда он говорит, что NoneType не имеет этого атрибута, это означает, что self.model - None в точке, в которой вы попали в эту строку. Вам нужно будет проследить свой код и посмотреть, почему его значение в этом случае будет None.

1

Мгновенное создание листингаManager напрямую препятствует поисковому механизму поиска базового объекта.

Вы можете это исправить, заменив строку:

lm = models.ListingManager() 

С линии:

lm = Listing.objects 

(или возможно)

lm = Listing.objects.all() 

В любом случае, вам необходимо обратиться к Менеджер через сама модель, иначе менеджер запросов потеряется.

Он должен работать (я только что провел полдень на аналогичных проблемах Должно любить Django сообщения об ошибках магии;).)

Смежные вопросы