Django не создает экземпляр модели каждый раз из представлений
У меня есть две модели, Person и Profiles, которые имеют отношения "один к одному" друг с другом. Модель Profiles состоит из набора BooleanFields, который указывает, есть ли у Person профили в социальных сетях.
#models.py
class Person(models.Model):
name = models.CharField(max_length=256)
address = models.TextField()
dob = models.DateField()
class Profiles(models.Model):
person = models.OneToOneField('Person', on_delete=models.CASCADE, related_name='profiles')
fb = models.BooleanField(default=False)
twitter = models.BooleanField(default=False)
insta = models.BooleanField(default=False)
linkedin = models.BooleanField(default=False)
Теперь, как только создается экземпляр модели Person, я хочу создать соответствующий экземпляр модели Profiles. Для этого в файле views.py, как только создается форма с атрибутами Person, я инстанцирую класс Profiles, в котором person будет только что созданный экземпляр. Как показано ниже:
#views.py
def upload(request):
if request.method == 'POST':
form = PersonUploadForm(request.POST)
if form.is_valid():
instance = form.save(commit=False)
instance.save()
prof = Profiles(person=instance)
prof.save()
else:
context = {'form': form}
return render(request, 'template.html', context)
else:
form = PersonUploadForm()
context = {'form': form}
return render(request, 'template.html', context)
Теперь проблема, с которой я столкнулся, заключается в том, что prof = Profiles(person=instance) и prof.save() не работают в 100% случаев. Я знаю это, потому что модели Person и Profiles не имеют одинакового количества объектов, хотя теоретически они должны быть одинаковыми. Я откровенно удивлен, что это происходит, потому что вызов save() происходит в нормальном потоке управления функцией представления, и нет никакой ошибки, вылетающей во время выполнения.
Что здесь происходит и как это исправить? Прошу прощения, если вопрос сформулирован неправильно
Другим подходом было бы использование сигналов django:
from django.db.models.signals import post_save
from django.dispatch import receiver
@receiver(post_save, sender=Person)
def create_profile(sender, instance, **kwargs):
prof = Profiles()
prof.person = instance
prof.save()