Django: невозможно создать несколько объектов модели с отношением «один к одному» с одной общей моделью

#django #django-models

#django #django-модели

Вопрос:

У меня есть две модели, которые расширяют auth.models.User django с one-to-one отношением между моделью и пользователем. Я хочу создать объекты любого из этих двух, используя форму.

две модели :

 class Worker(models.Model):
    address = models.CharField(max_length=400)
    user = models.OneToOneField(User, on_delete=models.CASCADE)

    @receiver(post_save, sender=User)
    def create_user_worker(sender, instance, created, **kwargs):
        if created:
            Worker.objects.create(user=instance)

    @receiver(post_save, sender=User)
    def save_user_worker(sender, instance, **kwargs):
        instance.worker.save()

class Employer(models.Model):
    address = models.CharField(max_length=400)
    user = models.OneToOneField(User, on_delete=models.CASCADE)

    @receiver(post_save, sender=User)
    def create_user_employer(sender, instance, created, **kwargs):
        if created:
            Employer.objects.create(user=instance)

    @receiver(post_save, sender=User)
    def save_user_employer(sender, instance, **kwargs):
        instance.employer.save()

  

И у меня есть функция просмотра создателя как:

 def worker_sign_up(request):
    if request.method == 'POST':
        form = WorkerSignUpForm(request.POST)

        if form.is_valid():
            user = form.save(commit=False)
            user.employer = None
            user.worker = Worker()
            user.worker.address= form.cleaned_data.get('address')
            user.save()
            raw_password = form.cleaned_data.get('password1')
            user = authenticate(username=user.username, password=raw_password)
            login(request, user)
            return redirect('home')
    else:
        form = WorkerSignUpForm()
    return render(request, 'registration/workersignup.html', {'form': form})


  

Я ожидаю user , что в моей базе данных будут a worker и a , но он создает оба Worker Employer объекта and .

ps. Мой класс формы:

 class WorkerSignUpForm(UserCreationForm):
    address = forms.CharField(max_length=400)

    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2')

  

Ответ №1:

Это потому, что вы связываете Employer объект и сохраняете User . Вместо использования user.save() используйте user.worker.save() . Это не создаст никакого объекта для Employer .

 #views.py
def worker_sign_up(request):
    if request.method == 'POST':
        form = WorkerSignUpForm(request.POST)

        if form.is_valid():
            user = form.save()  #save the user
            user.worker = Collector()  # not sure why you need this
            user.worker.address= form.cleaned_data.get('address')

            user.worker.save()  # this will create an object for Worker only

            raw_password = form.cleaned_data.get('password1')
            user = authenticate(username=user.username, password=raw_password)
            login(request, user)
            return redirect('home')
    else:
        form = WorkerSignUpForm()
    return render(request, 'registration/workersignup.html', {'form': form})
  

Кроме того, вам нужно сделать OneToOne поле необязательным.

 # models.py
class Worker(models.Model):
    address = models.CharField(max_length=400)
    user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True
)


class Employer(models.Model):
    address = models.CharField(max_length=400)
    user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True
)
  

Комментарии:

1. по-прежнему создает как «работодателя», так и «работника» в базе данных.

2. Все еще не работает. Кажется, «работодатель» создается на user = form.save()

3. Может быть возможно. Можете ли вы также поделиться своей формой?