繁体   English   中英

Django保存M2M关系的问题

[英]Django problems with saving a m2m relationship

我过去可以保存与表单之间的m2m关系,但是目前存在以下问题,我无法理解原因:

# models.py

class File(models.Model):
    client = models.ManyToManyField(Client)
    product = models.ForeignKey(Product, related_name='item_product')
    created = models.DateTimeField(default=datetime.now)
    created_by = models.ForeignKey(User)

# forms.py

class FileForm(ModelForm):

    class Meta:
        model = File
        exclude = ('client')

    def CustomSave(self,product,client,user):
        temp = self.save(commit=False)
        temp.product = product
        temp.client = client   # < ?!?!
        temp.created_by = user
        temp.save()
        temp.save_m2m()
        return temp

# views.py

def new_client_view(request):

    if request.method == 'POST':
        try:
            i_product = int(request.POST['product'])
        except ValueError:
            raise Http404()
        # get a 'product' from the POST data
        p = Product.objects.get(id=i_product)

        formFile = FileForm(p, request.POST, auto_id='f_%s')
        formItemData = ItemDataForm(p, request.POST, auto_id='i_%s')

        if formFile.is_valid() and formItemData.is_valid():
            c = Client()
            c.save()
            tempFile = formFile.CustomSave(p,c,request.user)
            tempItem = ItemForm().CustomSave(tempFile,request.user)
            formItemData.CustomSave(tempItem,request.user)
            return redirect(client_view, c.id)
        else:
            return render_to_response('newClient.html', {'error':'The form was not valid'}, context_instance=RequestContext(request))
     else:
        return render_to_response('newClient.html', {}, context_instance=RequestContext(request))

当我尝试以上内容时,我得到:

'File' instance needs to have a primary key value before a many-to-many relationship can be used.

django指示错误来自temp.client = client

我尝试了CustomSave各种排列,但CustomSave没有成功:(

有任何想法吗?

您正在尝试将一个客户端分配给ManyToMany字段。 如果它是客户端的ForeignKey,这将起作用,但是对于ManyToMany,您将必须执行以下操作:

temp.client.add(client)

注意:必须先保存temp ,然后才能分配客户端。 这是因为Django有一个用于将客户端映射到文件的表,如果该文件最初不存在,则无法添加带有null键的行。 查看Django生成的表结构应该有助于清理问题。

您试图在保存对象本身之前保存m2m关系(commit = False)。 要创建客户端和文件之间的关系,需要首先保存文件。

参见此处: Django:实例在多对多关系之前需要具有主键值

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM