Я запускаю свой проект на Python 3.7.5, Django> = 2.2.8, <3.0.0 и Postgres 12.1 Я реализовал 2 модели: </p>
class CustomUser(AbstractUser):
objects = CustomUserManager()
person = models.ForeignKey(
'Person', on_delete=models.DO_NOTHING, null=True)
class Person(models.Model):
uuid = models.UUIDField(primary_key=True, db_column='person_uuid')
first_name = models.CharField(max_length=255)
last_name = models.CharField(max_length=255)
address1 = models.CharField(max_length=255, blank=True, null=True)
address2 = models.CharField(max_length=255, blank=True, null=True)
add_date = models.DateTimeField(auto_now_add=True)
mod_date = models.DateTimeField(auto_now=True)
Представление CreateUser, показанное ниже, предназначено для регистрации новых пользователей. Это представление состоит из двух форм: формы создания пользователя и формы человека. После того, как пользователь введет свои данные, я хочу сохранить person_form и установить поле person в CustomUser для вновь созданного человека. Но значение pk после сохранения всегда равно None.
Чтобы обойти это, я запрашиваю модель Person с соответствующими first_name и last_name и использую UUID из ответа. Но это очень хрупко, поскольку у меня есть другие модели, которые используют UUID и не имеют уникальных значений, таких как first_name и last_name. Интересно, есть ли более надежный способ получить UUID только что сохраненной формы.
class CreateUserView(View):
template_name = 'core/create_user.html'
def get(self, request, *args, **kwargs):
user_form = CustomUserCreationForm()
person_form = PersonForm()
context = {'person_form': person_form,
'user_form': user_form}
return render(request, self.template_name, context=context)
def post(self, request, *args, **kwargs):
person_form = PersonForm(request.POST)
user_form = CustomUserCreationForm(request.POST)
print('Person form is valid: {}'.format(person_form.is_valid()))
if person_form.is_valid() and user_form.is_valid():
print('User form is valid')
person = person_form.save()
print(f'PK of new person is: {person.pk}')
p = Person.objects.filter(first_name=person.first_name,
last_name=person.last_name).latest('add_date')
user = user_form.save(commit=False)
user.person = p
user.save()
messages.success(request, 'Account created successfully')
return redirect('login')
else:
return render(request, self.template_name, {'person_form': person_form,
'user_form': user_form})
Примечание : Я понимаю, что Person и CustomUser могут быть одна модель, но Person используется в другом месте базы данных с другими сущностями и должен быть независимым от пользователя