2017-05-26 1 views
1

J'ai un problème avec def qui enregistre les données dans la base de données.Django sauvegarde dans DB: TypeError: int() l'argument doit être une chaîne, un objet semblable à un octet ou un nombre, pas un 'tuple'

@staticmethod 
    def _save(account, proxy, 
       proxy_provider_id, period, 
       country, start_date, 
       price, meta, 
       account_type, ip): 
     try: 
      period = int(period) 
      end_date = start_date + timedelta(days=period) 
      prx = Proxy() 
      prx.account = account 
      prx.proxy = proxy 
      prx.proxy_provider_id = proxy_provider_id 
      prx.period = period, 
      prx.country = country, 
      prx.start_date = start_date 
      prx.end_date = end_date 
      prx.price = price 
      prx.meta = meta 
      prx.ip = ip 
      print('\n') 
      print('Save proxy {}'.format(prx)) 
      print('account: {} type {}'.format(account, type(account))) 
      print('proxy: {} type {}'.format(proxy, type(proxy))) 
      print('proxy id: {} type {}'.format(proxy_provider_id, type(proxy_provider_id))) 
      print('country: {} type {}'.format(country, type(country))) 
      print('start date: {} type {}'.format(start_date, type(start_date))) 
      print('end date: {} type {}'.format(end_date, type(end_date))) 
      print('price: {} type {}'.format(price, type(price))) 
      print('meta: {} type {}'.format(meta, type(meta))) 
      print('ip: {} type {}'.format(ip, type(ip))) 
      print('\n') 
      prx.save() # exception raised there 

      payment = [start_date.strftime('%Y/%m/%d'), 
         end_date.strftime("%Y/%m/%d")] 
      payments = json.loads(account.history_of_payments) 
      payments.append(payment) 
      account.history_of_payments = json.dumps(payments) 
      account.account_type = account_type 

      print('\n') 
      print('Save account {}'.format(prx)) 
      print('payment: {} type {}'.format(payments, type(payments))) 
      print('account type: {} type {}'.format(account_type, type(account_type))) 
      print('\n') 

      account.save(update_fields=['history_of_payments', 'account_type']) 
      log.debug('Update account {}'.format(account)) 
     except Exception: 
      raise ProxyException('Exception, when trying to save proxy {} {} for {} ' 
           'date {} price {} meta {} ' 
           .format(proxy, country, account.username, 
             start_date, price, meta)) 
     else: 
      log.info('Save new proxy {} {} for {} from {} to {} price {} meta {} ' 
        .format(proxy, country, account.username, 
          start_date, end_date, price, meta)) 
      return True 

Je ne sais pas, ce qui cause cette exception, parce que je n'essaie pas d'enregistrer un tuple. Vous pouvez vérifier le journal. Il n'y a que des types srting, float, object, datetime et int.

TypeError: int() argument must be a string, a bytes-like object or a number, not 'tuple' 

journal complet est:

Save proxy Proxy object 
account: InstagramAccount object type <class 'models.models.InstagramAccount'> 
proxy: jFdDVV:[email protected]:17160 type <class 'str'> 
proxy id: 762064 type <class 'int'> 
country: us type <class 'str'> 
start date: 2017-05-26 16:09:31.604467+00:00 type <class 'datetime.datetime'> 
end date: 2017-05-29 16:09:31.604467+00:00 type <class 'datetime.datetime'> 
price: 3.6 type <class 'float'> 
meta: {"2017/05/26": {"time": "16:09:13", "proxy_type": "http", "account_type": "trial", "country": "us", "proxy": "jFdDVV:[email protected]:17160", "price": 3.6, "currency": "RUB"}} type <class 'str'> 
ip: 109.86.13.23 type <class 'str'> 


[2017-05-26 16:09:31,604] DEBUG Proxy jFdDVV:[email protected]:17160 check is successful 
--- Logging error --- 
Traceback (most recent call last): 
    File "/usr/instafy_py/src/service/views.py", line 130, in create_instagram_account 
    username=username) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/db/models/manager.py", line 85, in manager_method 
    return getattr(self.get_queryset(), name)(*args, **kwargs) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/db/models/query.py", line 385, in get 
    self.model._meta.object_name 
models.models.DoesNotExist: InstagramAccount matching query does not exist. 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "/usr/instafy_py/src/proxy/manager.py", line 208, in _save 
    prx.save() 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/db/models/base.py", line 796, in save 
    force_update=force_update, update_fields=update_fields) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/db/models/base.py", line 824, in save_base 
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/db/models/base.py", line 908, in _save_table 
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/db/models/base.py", line 947, in _do_insert 
    using=using, raw=raw) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/db/models/manager.py", line 85, in manager_method 
    return getattr(self.get_queryset(), name)(*args, **kwargs) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/db/models/query.py", line 1045, in _insert 
    return query.get_compiler(using=using).execute_sql(return_id) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 1053, in execute_sql 
    for sql, params in self.as_sql(): 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 1006, in as_sql 
    for obj in self.query.objs 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 1006, in <listcomp> 
    for obj in self.query.objs 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 1005, in <listcomp> 
    [self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields] 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 945, in prepare_value 
    value = field.get_db_prep_save(value, connection=self.connection) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/db/models/fields/__init__.py", line 755, in get_db_prep_save 
    prepared=False) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/db/models/fields/__init__.py", line 747, in get_db_prep_value 
    value = self.get_prep_value(value) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/db/models/fields/__init__.py", line 1832, in get_prep_value 
    return int(value) 
TypeError: int() argument must be a string, a bytes-like object or a number, not 'tuple' 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "/usr/instafy_py/src/service/views.py", line 169, in create_instagram_account 
    3, 'trial') 
    File "/usr/instafy_py/src/proxy/manager.py", line 156, in buy 
    account_type, ip) 
    File "/usr/instafy_py/src/proxy/manager.py", line 229, in _save 
    start_date, price, meta)) 
proxy.manager.ProxyException: Exception, when trying to save proxy jFdDVV:[email protected]:17160 us for guv.vop date 2017-05-26 16:09:31.604467+00:00 price 3.6 meta {"2017/05/26": {"time": "16:09:13", "proxy_type": "http", "account_type": "trial", "country": "us", "proxy": "jFdDVV:[email protected]:17160", "price": 3.6, "currency": "RUB"}} 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "/opt/python/lib/python3.5/logging/__init__.py", line 980, in emit 
    msg = self.format(record) 
    File "/opt/python/lib/python3.5/logging/__init__.py", line 830, in format 
    return fmt.format(record) 
    File "/opt/python/lib/python3.5/logging/__init__.py", line 567, in format 
    record.message = record.getMessage() 
    File "/opt/python/lib/python3.5/logging/__init__.py", line 330, in getMessage 
    msg = msg % self.args 
TypeError: not all arguments converted during string formatting 
Call stack: 
    File "/opt/python/lib/python3.5/threading.py", line 882, in _bootstrap 
    self._bootstrap_inner() 
    File "/opt/python/lib/python3.5/threading.py", line 914, in _bootstrap_inner 
    self.run() 
    File "/opt/python/lib/python3.5/threading.py", line 862, in run 
    self._target(*self._args, **self._kwargs) 
    File "/opt/python/lib/python3.5/socketserver.py", line 625, in process_request_thread 
    self.finish_request(request, client_address) 
    File "/opt/python/lib/python3.5/socketserver.py", line 354, in finish_request 
    self.RequestHandlerClass(request, client_address, self) 
    File "/opt/python/lib/python3.5/socketserver.py", line 681, in __init__ 
    self.handle() 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/core/servers/basehttp.py", line 174, in handle 
    handler.run(self.server.get_app()) 
    File "/opt/python/lib/python3.5/wsgiref/handlers.py", line 137, in run 
    self.result = application(self.environ, self.start_response) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/contrib/staticfiles/handlers.py", line 63, in __call__ 
    return self.application(environ, start_response) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/core/handlers/wsgi.py", line 170, in __call__ 
    response = self.get_response(request) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/core/handlers/base.py", line 124, in get_response 
    response = self._middleware_chain(request) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/core/handlers/exception.py", line 42, in inner 
    response = get_response(request) 
    File "/usr/instafy_py/src/middlewares/startup_middleware.py", line 13, in __call__ 
    response = self.get_response(request) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/core/handlers/exception.py", line 42, in inner 
    response = get_response(request) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/utils/deprecation.py", line 136, in __call__ 
    response = self.get_response(request) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/core/handlers/exception.py", line 42, in inner 
    response = get_response(request) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/utils/deprecation.py", line 136, in __call__ 
    response = self.get_response(request) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/core/handlers/exception.py", line 42, in inner 
    response = get_response(request) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/utils/deprecation.py", line 136, in __call__ 
    response = self.get_response(request) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/core/handlers/exception.py", line 42, in inner 
    response = get_response(request) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/utils/deprecation.py", line 136, in __call__ 
    response = self.get_response(request) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/core/handlers/exception.py", line 42, in inner 
    response = get_response(request) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/utils/deprecation.py", line 136, in __call__ 
    response = self.get_response(request) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/core/handlers/exception.py", line 42, in inner 
    response = get_response(request) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/utils/deprecation.py", line 136, in __call__ 
    response = self.get_response(request) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/core/handlers/exception.py", line 42, in inner 
    response = get_response(request) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/utils/deprecation.py", line 136, in __call__ 
    response = self.get_response(request) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/core/handlers/exception.py", line 42, in inner 
    response = get_response(request) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/utils/deprecation.py", line 136, in __call__ 
    response = self.get_response(request) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/core/handlers/exception.py", line 42, in inner 
    response = get_response(request) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/core/handlers/base.py", line 185, in _get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapped_view 
    return view_func(request, *args, **kwargs) 
    File "/usr/instafy_py/.virtualenvs/instafy_py/lib/python3.5/site-packages/django/utils/decorators.py", line 149, in _wrapped_view 
    response = view_func(request, *args, **kwargs) 
    File "/usr/instafy_py/src/service/views.py", line 171, in create_instagram_account 
    log.exception('Something wrong with proxy', e) 
Message: 'Something wrong with proxy' 
Arguments: (ProxyException('Exception, when trying to save proxy jFdDVV:[email protected]:17160 us for guv.vop date 2017-05-26 16:09:31.604467+00:00 price 3.6 meta {"2017/05/26": {"time": "16:09:13", "proxy_type": "http", "account_type": "trial", "country": "us", "proxy": "jFdDVV:[email protected]:17160", "price": 3.6, "currency": "RUB"}} ',),) 

Tous les types de données sont correspondance avec le modèle

class InstagramAccount(models.Model): 
    username = models.CharField(max_length=45, primary_key=True) 
    password = models.CharField(max_length=45) 
    account_id_account = models.ForeignKey(Account, models.DO_NOTHING, db_column='account_id_account') 
    expired_date = models.DateTimeField(null=False) 
    history_of_payments = models.TextField(blank=True, null=True) 
    account_type = models.TextField(default='trial') 

    class Meta: 
     managed = False 
     db_table = 'instagram_account' 
     unique_together = (('account_id_account', 'username'),) 

class Proxy(models.Model): 
    id_proxy = models.AutoField(primary_key=True) 
    proxy = models.CharField(max_length=45, blank=False, null=False) 
    meta = models.TextField(null=True) 
    start_date = models.DateTimeField(null=False) 
    end_date = models.DateTimeField(null=True) 
    country = models.CharField(max_length=45, null=False) 
    period = models.PositiveIntegerField() 
    price = models.FloatField(validators=[MinValueValidator(0.0), ]) 
    # It can confuse, but our proxy provider have it own id for proxy 
    proxy_provider_id = models.PositiveIntegerField() 
    ip = models.CharField(max_length=45, null=False, blank=False) 
    account = models.ForeignKey(InstagramAccount, models.DO_NOTHING, 
           db_column='instagram_account_account_id_account') 

    class Meta: 
     managed = False 
     db_table = 'proxy' 
     unique_together = (('id_proxy', 'account'),) 

si j'utilise des requêtes SQL, il serait mieux?

Répondre

2

Vous avez une virgule à la fin de la ligne où vous définissez prx.country, ce qui le transforme en un tuple.

Il y a pas mal de choses étranges dans ce code. Plus important encore, vous ne devriez pas attraper toutes les exceptions seulement pour élever votre propre; vous devriez attraper les erreurs que vous savez que vous pouvez gérer (et en fait les gérer, ne pas soulever une autre erreur); Tout le reste vous devriez laisser Django se gérer.

+0

lol, c'était tellement épique. Merci mec! –