在一个查询中保存相关模型

时间:2016-04-13 15:47:10

标签: django django-models django-forms

您好我有两个相关模型,我需要保存它取决于Angular的json数据 这是模特:

Class Company(models.Model):
    name = models.CharField(
        max_length=255, )

class ContactPerson(models.Model):
    company = models.ForeignKey(
        Company,
        related_name='contact_persons', )
    name = models.CharField(
        max_length=255, )

以下是观点的一部分:

class CompanyCreate(JsonView):
    #JsonView write by me, contains some methods
    def post(self, *args, **kwargs):
        data = json.loads(self.request.body)
        company = CompanyForm(data=data['company'])
        contacts = ContactForm(data=data['contacts'])
    if company.is_valid():
            company.save()
            if contacts.is_valid():
                contacts.save(commit=False)
                contacts.company = company
                contacts.save()
    return HttpResponse()

公司正在保存,但我无法通过有效的联系表单,因为我无法从第一个表单中获取company.id

1 个答案:

答案 0 :(得分:2)

我认为你不能立刻保存它们,因为:

  1. 它们是具有外键关系的实例,因此在另一个之前不存在。

  2. 它们是3个不同的模型实例,因此将它们组合在一个表单中是没有意义的。

  3. 如果您只想保存有效的那些并拒绝无效的那些,那么您目前所做的就是一次更改就足够了,捕获save()函数的返回值:

    class CompanyCreate(JsonView):
        #JsonView write by me, contains some methods
    
        def post(self, *args, **kwargs):
            data = json.loads(self.request.body)
            company_form = CompanyForm(data=data['company'])
            contacts_form = ContactForm(data=data['contacts'])
        if company_form.is_valid():
                company = company_form.save()
                if contacts.is_valid():
                    contacts = contacts_form.save(commit=False)
                    contacts.company = company
                    contacts.save()
        return HttpResponse()
    

    如果您想要“全部或全部”逻辑,这意味着如果一切都有效则保存所有内容,否则不保存任何内容,您应该排除每个ModelForm上的外键,以便在您有效时表单,他们忽略了ForeignKey存在的验证,但没有忽略所有其他字段。看看是否有意义。