简体   繁体   中英

Django get_or_create does not return a usable Model object in clean method of ModelForm

Hello,

I have bound a ModelForm to one of my model that contains a ForeignKey to another model everything driven by a CreateView. What I want to achieve is to create the model object corresponding to the foreign key if it doesn't exist before the form is overall validated and the final object created in database.

Below the models I use:

class UmsAlerting(models.Model):
     alert_id = models.IntegerField(primary_key=True, editable=False)
     appli = models.ForeignKey('UmsApplication')
     env = models.ForeignKey('UmsEnvironment')
     contact = models.ForeignKey('UmsContacts')
     custom_rule = models.ForeignKey('UmsCustomRules', null=True, blank=True)

class UmsApplication(models.Model):
     appli_id = models.IntegerField(primary_key=True)
     trigram_ums = models.CharField(max_length=4L)

class UmsContacts(models.Model):
     contact_id = models.IntegerField(primary_key=True)
     mail_addr = models.CharField(max_length=100L)

class UmsEnvironment(models.Model):
     env_id = models.IntegerField(primary_key=True)
     env_name = models.CharField(max_length=5L)

The model bound to the form is UmsAlerting . The model object I want to create if it doesn't exist is UmsContacts . I managed to use the field's clean method in my ModelForm of the contact field and use the get_or_create method like below:

def clean_contact(self):
     data = self.cleaned_data['contact']
     c, _ = UmsContacts.objects.get_or_create(mail_addr=data)
     return c

It perfectly works when the contact is already in the database but when it needs to be created my form return a ValidationError on the contact field saying "This field cannot be null". If I submit the same form a second time without changing anything the UmsAlerting object is well created with no validation error.

My guess is that, for a reason I don't get, when get_or_create is used to create a UmsContacts object it cannot be used to create the new UmsAlerting object. So in clean_contact method the get is working and returns the UmsContacts object but the create part doesn't. It'd be like the UmsContacts object is saved when the whole form is validated but not before as I'd want it to.

Anyone could help me find out what is the problem ? Is using the clean method not the best idea ? Is there another strategy to use to take around this problem ?

Thanks in advance for your help.

It's probably because the object you are creating expects value for contact_id. If you use contact_id field for just setting object id -then you do not have to create it at all. Django takes care of Id's automatically.

Also. field clean method should return cleaned data not object. That creates whole lot more problems on its own.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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