如何用get_or_create中的另一个对象更新对象?

时间:2014-12-08 16:36:47

标签: python mysql django

我必须使用类似字段的表,并且我想将对象从一个表复制到另一个表。 第二个表中可能缺少对象的问题,所以我必须使用get_or_create()方法:

#these are new products, they all are instances of NewProduct model, which is similar
#to Product model
new_products_list = [<NewProduct: EEEF0AP>, <NewProduct: XR3D-F>,<Product: XXID-F>]

#loop over them and check if they are already in database
for product in new_products_list:
    product, created = Products.objects.get_or_create(article=product.article)

    if created:
       #here is no problem because new object saved 
       pass
    else:
       # here I need to code that will update existing Product instance
       # with values from NewProduct instance fields

案例是我不想手动列出所有字段进行更新,因为我有大约30个:

update_old_product = Product(name=new_product.name,article= new_product.article)

请建议比上面更优雅的方式

3 个答案:

答案 0 :(得分:1)

您可以遍历字段名称并在另一个Product实例中更新它们:

for new_product in new_products_list:
    # use different variable names, otherwise you won't be able to access
    # the item from new_product_list here
    product, created = Products.objects.get_or_create(article=new_product.article)

    if not created:
       for field in new_product._meta.get_all_field_names():
           setattr(product, field, getattr(new_product, field))
       product.save()

答案 1 :(得分:0)

你可以尝试这样的事情。

def copy_fields(frm, to):
    id = to.id
    for field in frm.__class__._meta.fields:
        setattr(to, field.verbose_name, field._get_val_from_obj(frm))
    to.id = id

答案 2 :(得分:-1)

这类似于Ashwini Chaudhary,虽然我认为它会照顾你在评论中提到的那个错误。

new_products_list= (
#   obj1, obj2, obj3 would be from [<NewProduct: EEEF0AP>, <NewProduct: XR3D-F>,<Product: XXID-F>] in your question
#   NewProduct would just be the model that you import
#   NewProduct._meta.fields would be all the fields
    (obj1, NewProduct, NewProduct._meta.fields,),
    (obj2, NewProduct, NewProduct._meta.fields,),
    (obj3, NewProduct, NewProduct._meta.fields,),
)

for instance, model, fields in new_products_list:
    new_fields = {}
    obj, created = model.objects.get_or_create(pk=instance.article) # this is pretty much just here to ensure that it is created for filter later
    for field in fields:
        if field != model._meta.pk: # do not want to update the pk
            new_fields[field.name] = request.POST[field.name]
    model.objects.filter(pk=question_id).update(**new_fields) # you won't have to worry about updating multiple models in the db because there can only be one instance with this pk

我知道这是一个多月以前的事了,但我想我会分享我的解决方案,即使你已经弄清楚了