我制作了以下模型:

class Post(models.Model):
    title = models.CharField(max_length=50, blank=True, null=True)

class OrderInfo(models.Model):
    post = models.OneToOneField(Post, on_delete=models.CASCADE, primary_key=True)
    position = models.CharField(max_length=50, blank=True, null=True)

@receiver(post_save, sender=Post)
def update_order_info(sender, instance, created, **kwargs):
    if created:
        OrderInfo.objects.create(post=instance)
    instance.orderinfo.save()


在视图中

class OrderPostWriteView(FormView):
    form_class = OrderPostForm
    template_name = 'board/order/order_post_write.html'
    success_url = '/index/'

    def form_valid(self, form):
        form_class = self.get_form_class()
        form = self.get_form(form_class)

        if form.is_valid():
            post = form.save(commit=False)
            post.orderinfo.position= form.cleaned_data.get('position')

            post.save()
            return redirect('index')
        else:
            return render(self.request, 'board/order/order_post_write.html', {'form': form})


forms.py:

class OrderPostForm(forms.ModelForm):
    position = forms.CharField()
    class Meta:
        model = Post
        fields = ('title', 'position')


并返回RelatedObjectDoesNotExist错误。

帖子没有orderinfo。

我该怎么办?

(我认为Django系统正在将.orderinfo作为帖子的专栏处理。但是为什么呢?)

最佳答案

您正在尝试在创建该对象之前设置相关orderinfo的属性。保存该帖子时会触发您的信号,但是由于使用commit=False而明确不保存它,因此不会触发该信号。

实际上,您不需要这样做。只需正常保存对象,让信号触发,然后设置位置即可。您无需再次保存该帖子,但是您需要保存orderinfo。

(如果这是可以创建Post的唯一位置,则最好完全删除信号,而直接在此处直接创建orderinfo,包括位置,这样就不必保存两次。)

关于python - Django一对一字段RelatedObjectDoesNotExist,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48315521/

10-11 22:34