Update_or_create不会尊重唯一键

vil*_*kos 19 django

我在Django中使用以下模型:

class sfs_upcs(models.Model):
  upc = models.CharField(max_length=14, unique=True)
  product_title = models.CharField(max_length=150,default="Not Available")
  is_buyable = models.NullBooleanField()
  price = models.DecimalField(max_digits=8, decimal_places=2,default="0.00")
  image_url = models.URLField(default=None)
  breadcrumb = models.TextField(default=None)
  product_url = models.URLField(default=None)
  timestamp = models.DateTimeField(auto_now=True)
Run Code Online (Sandbox Code Playgroud)

然后我在views.py上使用以下代码:

def insert_record(upc_dict):
  upc = upc_dict['upc']
  product_title = upc_dict['product_title']
  is_buyable = upc_dict['is_buyable']
  price = upc_dict['price']
  image_url = upc_dict['image_url']
  breadcrumb = upc_dict['breadcrumb']
  product_url = upc_dict['product_url']
  obj, created = sfs_upcs.objects.update_or_create(
    defaults={'product_title':product_title,'is_buyable':is_buyable,
    'price':price,'image_url':image_url,'breadcrumb':breadcrumb,'product_url':product_url
    },
    upc = upc,
    product_title = product_title,
    is_buyable = is_buyable,
    price = price,
    image_url = image_url,
    breadcrumb = breadcrumb,
    product_url = product_url)

  print obj,created
Run Code Online (Sandbox Code Playgroud)

我正在使用文档https://docs.djangoproject.com/en/1.8/ref/models/querysets/#update-or-create中的update_or_create方法,并通过将值传入'defaults'字典来说如果对象存在,你想要更新你应该诀窍...但我一直得到一个"在...的完整性错误列upc并不是唯一的"...

有任何想法吗?

knb*_*nbk 52

有两个部分update_or_create():用于选择对象的过滤器值以及实际更新的更新值.关键字过滤要更新的对象,默认值是更新的值.如果过滤器不匹配,则会创建一个新对象.

现在你正在过滤所有这些值,因为它们都是作为关键字参数提供的:

upc = upc,
product_title = product_title,
is_buyable = is_buyable,
price = price,
image_url = image_url,
breadcrumb = breadcrumb,
product_url = product_url
Run Code Online (Sandbox Code Playgroud)

IntegrityError意味着,即使该特定值upc存在,也不存在匹配所有这些过滤器的对象.Django然后尝试创建对象,但upc它不是唯一的,所以这会导致一个IntegrityError.

如果仅过滤upc,则该字段永远不会导致IntegrityError引发:找到并更新现有对象,或者创建新对象,但值为upc唯一.

所以要解决这个问题,只需:

obj, created = sfs_upcs.objects.update_or_create(
    # filter on the unique value of `upc`
    upc=upc,
    # update these fields, or create a new object with these values
    defaults={
        'product_title': product_title, 'is_buyable': is_buyable,  'price': price, 
        'image_url': image_url, 'breadcrumb': breadcrumb, 'product_url': product_url,
    }
)
Run Code Online (Sandbox Code Playgroud)

  • 嗯我从文档中不明白.是我还是不是那么清楚? (13认同)
  • @villancikos它完全不清楚!我也用这个解决方案想出来了,谢谢! (2认同)