Paul R
Paul R

Reputation: 2797

Saving OnetoOne field manually in django

I have following models:

class Person(User):
    first_name = models.CharField(verbose_name=_('first name'), max_length=30)
    last_name = models.CharField(verbose_name=_('last name'), max_length=30)

class Service(models.Model):
    person = models.ForeignKey(Person, related_name='services')
    price_from = models.DecimalField(_('price form'), max_digits=10, decimal_places=2, validators=[MinValueValidator(Decimal('0.01'))])
    price_to = models.DecimalField(_('price to'), max_digits=10, decimal_places=2, validators=[MinValueValidator(Decimal('0.01'))])

class WorkPlace(models.Model):
    service = models.OneToOneField('Service', related_name='work_place', primary_key=True)
    city = CharField(verbose_name=_('city'), max_length=255)
    street = CharField(verbose_name=_('street'), max_length=255)

I also registered Person in admin and made Service an inline admin. Due to design, city and address are entered as multivalue field. The problem is that I can't save WorkPlace manually. Here are the forms:

class WorkPlaceForm(forms.ModelForm):
    class Meta:
        model = WorkPlace
        fields = '__all__'

class PersonForm(forms.ModelForm):
    class Meta:
        model = Person
        fields = '__all__'

class ServiceForm(forms.ModelForm):
    class Meta:
        fields = '__all__'
        model = Service

    multi_work_place = MyMultiValueField()

    def save(self, commit=True):
        service = super(ServiceForm, self).save(commit=commit)
        if self.cleaned_data['multi_work_place']:
            work_place = WorkPlace(**{
                'city': self.cleaned_data['multi_work_place'][0],
                'street': self.cleaned_data['multi_work_place'][1],
            })
            # when there is brand new object is created, there is no service.pk
            work_place.service = service # how???
            work_place.save()
        return service

Moreover, if I write service = super(ServiceForm, self).save(commit=True) on new object, this will raise Error as there is no Person created.

How can I solve this problem? Recall, that I'm working in admin.

Upvotes: 1

Views: 4184

Answers (2)

Paul R
Paul R

Reputation: 2797

class ServiceForm(forms.ModelForm):
    class Meta:
        fields = '__all__'
        model = Service

    multi_work_place = MyMultiValueField()

    def save(self, commit=True):
        service = super(ServiceForm, self).save(commit=False)
        service.member_id = service.member.pk # here is the key command
        service.save()
        if self.cleaned_data['multi_work_place']:
            work_place = WorkPlace(**{
                'city': self.cleaned_data['multi_work_place'][0],
                'street': self.cleaned_data['multi_work_place'][1],
            })
            # when there is brand new object is created, there is no service.pk
            work_place.service = service # how???
            work_place.save()
        return service

I just needed to add member pk to service model

Upvotes: 1

warath-coder
warath-coder

Reputation: 2122

try this:

class ServiceForm(forms.ModelForm):
    class Meta:
        fields = '__all__'
        model = Service

    multi_work_place = MyMultiValueField()

    def save(self, commit=True):
        service = save_instance(self, self.instance, self._meta.fields,
                             fail_message, commit, self._meta.exclude,
                             construct=False)
        service.save()
        if self.cleaned_data['multi_work_place']:
            work_place = WorkPlace(**{
                'city': self.cleaned_data['multi_work_place'][0],
                'street': self.cleaned_data['multi_work_place'][1],
            })
            # when there is brand new object is created, there is no service.pk
            work_place.service = service 
            work_place.save()
        return service

Upvotes: 0

Related Questions