Django form.save () не возвращает значение pk, если pk - это UUID - PullRequest
0 голосов
/ 04 августа 2020

Я запускаю свой проект на 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 используется в другом месте базы данных с другими сущностями и должен быть независимым от пользователя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...