I have tried to use the update_or_create() method assuming that it would
either, create a new entry in the db if it found none or update an existing
one if it found one and had differences to the defaults passed in - or
wouldn't update if there was no difference. However it just seemed to
recreate entries each time even if there were no changes.
I think the issue was that I wanted to:
1) get an entry if all fields were the same,
2) or create a new entry if it didn't find an existing entry with the
unique_id
3) or if there was an entry with the same unique_id, update that entry with
remaining fields.
The update_or_create() method doesn't seem to work as I had hoped using how
I have called it below - it just always seems to do an update if it finds a
match on the given kwargs.
Or if I tried passing in all That would
would have to be passing in all the fields as keyword args to check that
nothing had changed but then that would miss option 3) finding an existing
entry that
supplier, created =
Supplier.objects.update_or_create(unique_id=product_detail['supplierId'],
defaults={
'name':
product_detail['supplierName'],
'entity_name_1':
entity_name_1,
'entity_name_2':
entity_name_1,
'rating':
product_detail['supplierRating']})
class Supplier(models.Model):
unique_id = models.IntegerField(unique=True)
name = models.CharField(max_length=255, unique=True)
entity_name_1 = models.CharField(max_length=255, blank=True)
entity_name_2 = models.CharField(max_length=255, blank=True)
rating = models.CharField(max_length=255)
last_updated = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
Not being convinced that update_or_create() would give me what I needed I made
the below function:
def create_or_update_if_diff(defaults, model):
try:
instance = model.objects.get(**defaults)
# if no exception, the product doesn't need to be updated
except model.DoesNotExist:
# the product needs to be created or updated
try:
model.objects.get(unique_id=defaults['unique_id'])
except model.DoesNotExist:
# needs to be created
instance = model.objects.create(**defaults)
# model(**defaults).save()
sys.stdout.write('New {} created: {}\n'.format(model,
instance.name))
return instance, True
else:
# needs to be updated
instance = model.objects.update(**defaults)
sys.stdout.write('{}:'
' {} updated \n'.format(model,
instance.unique_id))
return instance, True
return instance, False
However I can't get it to be quite right. I key a key error on update possibly
because the defaults passed in now include unique_id. Should the unique_id be
separated and both passed into the function to fix this? (And should I have
created a function to achieve this - or would have update_or_create() have been
able to do this.?)
supplier_defaults={
'unique_id':
product_detail['supplierId'],
'name':
product_detail['supplierName'],
'entity_name_1':
entity_name_1,
'entity_name_2':
entity_name_2,
'rating':
product_detail['supplierRating']}
--
You received this message because you are subscribed to the Google Groups
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-users/a0b6e1dd-d583-480e-9c6e-540c1ad4511a%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.