代码之家  ›  专栏  ›  技术社区  ›  Lord Elrond Mureinik

Django模型在调用对象。更新或创建

  •  0
  • Lord Elrond Mureinik  · 技术社区  · 7 年前

    我很难用Django的 update_or_create 方法。我得到这个错误:

    ValueError:基为10的int()的文本无效:''

    这个错误似乎总是出现在 更新或创建 ,因为当我添加 verified=False (其默认值为False)对于语句,可以追溯到 验证=错误 而不是下面显示的行。

    我的模型:

    class Addresses(models.Model):
        customer = models.ForeignKey('Customers', on_delete=models.CASCADE)
        address_name = models.CharField(max_length=45)
        company = models.CharField(max_length=45)
        street1 = models.CharField(max_length=60)
        street2 = models.CharField(max_length=30, blank=True, null=True)
        street3 = models.CharField(max_length=30, blank=True, null=True)
        city = models.CharField(max_length=45)
        state = models.CharField(max_length=45)
        zip = models.IntegerField()
        country = models.CharField(default='US', max_length=45)
        phone = models.IntegerField(blank=True, null=True)
        residential = models.BooleanField(default=True)
        verified = models.BooleanField(default=False)
    
    class Customers(models.Model):
        customer_name = models.CharField(max_length=75)
        email = models.CharField(max_length=60, blank=True, null=True)
        phone = models.IntegerField(blank=True, null=True)
        ss_customer_id = models.IntegerField(blank=True, null=True, unique=True)
    

    功能:

    def addAddress(self, address, customer_id):
        if address['name'] is not None and address['street1'] is not None and address['city'] is not None:
            if address['state'] is not None and address['postalCode'] is not None:
    
                address, created = Addresses.objects.update_or_create(
                    address_name=address['name'],
                    company=address['company'],
                    street1=address['street1'],
                    street2=address['street2'],
                    street3=address['street3'],
                    city=address['city'],
                    state=address['state'],
                    country=address['country'],
                    phone=address['phone'],
                    customer=customer_id #error thrown here
                )
    
                address.save()
                return address
        return False
    

    数据:

    address = {
        'name': 'Johnny Appleseed',
        'company': 'Apple Inc',
        'street1': '456 Street',
        'street2': 'APT 12',
        'street3': None,
        'city': 'City',
        'state': 'LA',
        'postalCode': '90000',
        'country': 'US',
        'phone': '4444444444',
    }
    customer_id = 2 #this is a valid primaryKey
    
    self.addAddress(address, customer_id)
    

    这是完整的回溯:

    Traceback (most recent call last):
      File "/Users/jane/Code/dbmu-env/env/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
        response = get_response(request)
      File "/Users/jane/Code/dbmu-env/env/lib/python3.7/site-packages/django/core/handlers/base.py", line 126, in _get_response
        response = self.process_exception_by_middleware(e, request)
      File "/Users/jane/Code/dbmu-env/env/lib/python3.7/site-packages/django/core/handlers/base.py", line 124, in _get_response
        response = wrapped_callback(request, *callback_args, **callback_kwargs)
      File "/Users/jane/Code/dbmu-env/env/lib/python3.7/site-packages/django/views/generic/base.py", line 68, in view
        return self.dispatch(request, *args, **kwargs)
      File "/Users/jane/Code/dbmu-env/env/lib/python3.7/site-packages/django/utils/decorators.py", line 45, in _wrapper
        return bound_method(*args, **kwargs)
      File "/Users/jane/Code/dbmu-env/env/lib/python3.7/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
        return view_func(*args, **kwargs)
      File "/Users/jane/Code/dbmu-env/env/lib/python3.7/site-packages/django/views/generic/base.py", line 88, in dispatch
        return handler(request, *args, **kwargs)
      File "/Users/jane/Code/dbmu-env/dbmu/webhooks.py", line 39, in post
        self.process_orders(orders)
      File "/Users/jane/Code/dbmu-env/dbmu/webhooks.py", line 57, in process_orders
        shipping = self.addAddress(order['shipTo'], customer_id)
      File "/Users/jane/Code/dbmu-env/dbmu/webhooks.py", line 88, in addAddress
        verified=False,
      File "/Users/jane/Code/dbmu-env/env/lib/python3.7/site-packages/django/db/models/manager.py", line 82, in manager_method
        return getattr(self.get_queryset(), name)(*args, **kwargs)
      File "/Users/jane/Code/dbmu-env/env/lib/python3.7/site-packages/django/db/models/query.py", line 502, in update_or_create
        obj = self.select_for_update().get(**lookup)
      File "/Users/jane/Code/dbmu-env/env/lib/python3.7/site-packages/django/db/models/query.py", line 390, in get
        clone = self.filter(*args, **kwargs)
      File "/Users/jane/Code/dbmu-env/env/lib/python3.7/site-packages/django/db/models/query.py", line 844, in filter
        return self._filter_or_exclude(False, *args, **kwargs)
      File "/Users/jane/Code/dbmu-env/env/lib/python3.7/site-packages/django/db/models/query.py", line 862, in _filter_or_exclude
        clone.query.add_q(Q(*args, **kwargs))
      File "/Users/jane/Code/dbmu-env/env/lib/python3.7/site-packages/django/db/models/sql/query.py", line 1263, in add_q
        clause, _ = self._add_q(q_object, self.used_aliases)
      File "/Users/jane/Code/dbmu-env/env/lib/python3.7/site-packages/django/db/models/sql/query.py", line 1287, in _add_q
        split_subq=split_subq,
      File "/Users/jane/Code/dbmu-env/env/lib/python3.7/site-packages/django/db/models/sql/query.py", line 1225, in build_filter
        condition = self.build_lookup(lookups, col, value)
      File "/Users/jane/Code/dbmu-env/env/lib/python3.7/site-packages/django/db/models/sql/query.py", line 1096, in build_lookup
        lookup = lookup_class(lhs, rhs)
      File "/Users/jane/Code/dbmu-env/env/lib/python3.7/site-packages/django/db/models/lookups.py", line 20, in __init__
        self.rhs = self.get_prep_lookup()
      File "/Users/jane/Code/dbmu-env/env/lib/python3.7/site-packages/django/db/models/lookups.py", line 70, in get_prep_lookup
        return self.lhs.output_field.get_prep_value(self.rhs)
      File "/Users/jane/Code/dbmu-env/env/lib/python3.7/site-packages/django/db/models/fields/__init__.py", line 1807, in get_prep_value
        return int(value)
    ValueError: invalid literal for int() with base 10: ''
    

    更新

    我试过了,还是犯了同样的错误:

    def addAddress(self, address, customer_id):
        ...
        customer = Customers.objects.get(pk=customer_id)
        print(customer) #Customers object (2)
    
        address, created = Addresses.objects.update_or_create(
        ...
    
        customer=customer,
        )
    

    我做错什么了?任何建议都将不胜感激:)

    1 回复  |  直到 7 年前
        1
  •  1
  •   hd1 Madan Sapkota    7 年前

    地址.客户是一个对象,而不仅仅是一个id。为了填充它,您需要从数据库中检索它。因此:

     Customer.objects.get(customer_id)
    

    希望能有所帮助。

        2
  •  0
  •   Lord Elrond Mureinik    7 年前

    多亏了@hd1,我才弄明白这一点。我有三个问题 Addresses.objects.update_or_create

    • 我传递的是一个customer主键,而不是customer对象(hd1的答案)

    • 我没有设置所需的值 zip 领域

    • 电话号码列超出其值的最大长度

    因为某些原因,所有这些事情导致了我的问题被抛出错误!

    在我解决了所有这些问题之后,我就不再犯错误了。