Django.db.utils.IntegrityError: UNIQUE constraint failed OneToOneField Django
У меня проблема с моей базой данных. У меня есть две модели (Member, ActiveMember) с настроенными отношениями OneToOneField. Член может иметь только одно членство одновременно. Однако, похоже, я получаю ошибку Unique. Как только я обновляю членство члена с помощью функции обновления, все перепутывается, и ID больше не работает. Я также получаю другую ошибку DoesNotExist. Я думаю, что это происходит, когда я удаляю члена и/или обновляю его, идентификаторы каким-то образом смещаются. Эту ошибку я получил при попытке миграции. Мне пришлось удалить пользователя, который создавал мне проблемы, чтобы это сработало.
Это вторая ошибка DoesNotExist
Traceback (most recent call last):
File "/home/topxgym/.virtualenvs/env/lib/python3.9/site-packages/django/core/handlers/exception.py", line 55, in inner
response = get_response(request)
File "/home/topxgym/.virtualenvs/env/lib/python3.9/site-packages/django/core/handlers/base.py", line 197, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/topxgym/.virtualenvs/env/lib/python3.9/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapped_view
return view_func(request, *args, **kwargs)
File "/home/topxgym/.virtualenvs/env/topxgym/members/views.py", line 184, in update
member = ActiveMember.objects.get(pk=id)
File "/home/topxgym/.virtualenvs/env/lib/python3.9/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/home/topxgym/.virtualenvs/env/lib/python3.9/site-packages/django/db/models/query.py", line 650, in get
raise self.model.DoesNotExist(
Exception Type: DoesNotExist at /update/7
Exception Value: ActiveMember matching query does not exist.
Это мой models.py
class Member(models.Model):
full_name = models.CharField(max_length=125, unique=True)
email = models.EmailField(max_length=125, blank=True, null=True)
phone = models.CharField(max_length=20)
detail = models.CharField(max_length=256, blank=True, null=True)
image = models.ImageField(max_length= 256, upload_to='media', null=True, blank=True)
date_created = models.DateTimeField(default=django.utils.timezone.now)
class Meta:
verbose_name_plural = "All Members"
def __str__(self):
return str(f"{self.full_name}")
def save(self, *args, **kwargs):
# delete old file when replacing by updating the file
try:
this = Member.objects.get(id=self.id)
if this.image != self.image:
this.image.delete(save=False)
except: pass # when new photo then we do nothing, normal case
super(Member, self).save(*args, **kwargs)
class ActiveMember(models.Model):
member = models.ForeignKey(Member, on_delete=models.CASCADE, related_name='is_member')
start_date = models.DateField(default=django.utils.timezone.now)
end_date = models.DateField(default=django.utils.timezone.now)
status = models.CharField(max_length=2, choices=(('0','None'), ('1','Active'), ('2','Inactive')), default = '1')
def __str__(self):
return str(f"{self.member}")
Это мой views.py
@login_required(login_url='authenticate/admin_login')
def update(request, id):
member = ActiveMember.objects.get(pk=id)
if request.method == 'POST':
form = ActiveMemberForm(request.POST, instance=member)
if form.is_valid():
# save form data to variables
active_member = form.cleaned_data['member']
start_date = form.cleaned_data['start_date']
status = form.cleaned_data['status']
# send WhatsApp message to inform user his membership has been activated.
if active_member.phone is not None and status == '1':
msg = WhatsApp(active_member.full_name, active_member.phone, start_date)
msg.send_message('customer_active')
# save form to database.
form.save()
# redirect to the success message
return render(request, 'members/update.html', {
'form': form,
'success': True,
})
else:
form = ActiveMemberForm(instance=member)
return render(request, 'members/update.html', {
'form': form,
'member': member,
})
@login_required(login_url='authenticate/admin_login')
def delete(request, id):
if request.method == 'POST':
if request.user.is_superuser:
member = Member.objects.get(pk=id)
member.delete()
return HttpResponseRedirect(reverse('members:index'))