Reputation: 681
I have an existing entry in the database, and i want to check in my views.py if the entry already exists in the DB, if it does then the new values will replace the old data in that row, otherwise create a new row for that user. How can i do that?
#models.py
class Member(models.Model):
username = models.CharField(max_length=16, primary_key=True)
password = models.CharField(max_length=16)
profile = models.OneToOneField(Profile, null=True)
following = models.ManyToManyField("self", symmetrical=True)
class Message(models.Model):
user = models.ForeignKey(Member, related_name='%(class)s_user')
recip = models.ForeignKey(Member, related_name='%(class)s_recip')
pm = models.BooleanField(default=True)
time = models.DateTimeField()
text = models.CharField(max_length=4096)
def __str__(self):
return self.username
#forms.py
class UploadFileForm(forms.ModelForm):
class Meta:
model = ProfilePic
fields = ['text','thumbnail']
#models.py
class ProfilePic(models.Model):
user = models.ForeignKey(Member, related_name='%(class)s_user', null=True)
text = models.TextField(max_length=4096)
thumbnail = models.FileField(upload_to='media', null=True)
#views.py
if request.POST:
username = request.session['username']
member_obj = Member.objects.get(pk=username)
form = UploadFileForm(request.POST,request.FILES)
profile_pic = form.save(commit=False)
**#checking if username already exists in the DB:**
member_obj = Member.objects.update_or_create(username=username)
**#if yes then replace data in the row with the new one,
# if not create a new row**
profile_pic.user = member_obj
profile_pic.save()
Upvotes: 1
Views: 2842
Reputation: 309
Try this,
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
cd = form.cleaned_data
username = request.session['username']
if Member.objects.filter(username=username).exists():
member_obj = Member.objects.get(username=username)
profile_pic = ProfilePic.objects.get(user=member_obj)
profile_pic.user = member_obj
# you can update other fields by using object.field_name (e.g. profile_pic.text = request.POST.get['text']
profile_pic.save()
else:
ProfilePic.objects.create(user=username)
return HttpResponse('success')
else:
return HttpResponse(form.errors)
else:
form = UploadFileForm
Upvotes: 2
Reputation: 9110
You should change the queryset:
member_obj = Member.objects.get(pk=username)
to
member_obj = Member.objects.get(username=username)
if username = request.session['username']
is the username
attribute of the user
object. If you work with username
s (instead of id
s) you have to enforce distinct usernames.
If you want to work with pk
(id
) you should store it in session and then the query would be:
user_id = request.session['id']
member_obj = Member.objects.get(pk=user_id)
Upvotes: 0
Reputation: 3232
As you did, update_or_create
is here for that. However, you should use it as follow:
defaults = {} # Here you should specify the values that will be updated on the member object,
# Or the default values to pass to the newly created instance
# Update or create return a tuple (object, created), created being a boolean
member_obj, created = Member.objects.update_or_create(username=username, defaults=defaults)
# This part seems correct to me
profile_pic.user = member_obj
profile_pic.save()
Upvotes: 0