【问题标题】:Django: can not create multiple model objects with one-to-one relation with one common modelDjango:无法与一个通用模型创建具有一对一关系的多个模型对象
【发布时间】:2019-04-20 10:25:45
【问题描述】:

我有两个模型扩展了 django 的 auth.models.User 与模型和用户之间的 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 和一个worker,但它同时创建了WorkerEmployer 对象。

附言 我的表单类是:

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

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

【问题讨论】:

    标签: django django-models


    【解决方案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
    )
    

    【讨论】:

    • 仍然在数据库中创建“雇主”和“工人”。
    • 还是不行。似乎“雇主”是在user = form.save() 上创建的
    • 有可能。你也可以分享你的表格吗?
    猜你喜欢
    • 2015-04-12
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    相关资源
    最近更新 更多