0

я пытаюсь получить Джанго автоматически создать экземпляр 2-й модели при создании 1-го по CreatView:Джанго - сделать CreateView сохранить две различные модели

models.py 

class MAG_magazyn(models.Model): #1st 
    nr_ident=models.CharField(max_length=50, unique=True) 
    nazwa=models.CharField(max_length=50) 
    typ=models.CharField(max_length=50, blank=True, null=True) 
    podzespol=models.BooleanField(default=False) 
    kategoria=models.ForeignKey(MAG_kategorie_czesci) 

class MAG_magazyn_stan(models.Model): #2nd 
    id_czesc=models.OneToOneField(MAG_magazyn) 
    regal=models.CharField(max_length=3) 
    polka=models.CharField(max_length=3) 
    stan_min=models.IntegerField() 
    stan=models.IntegerField() 
    alert=models.IntegerField(default=0) 
    rel_stan=models.DecimalField(...) 

Теперь, как связаны эти модели я хотел бы добавить экземпляр 2nd с некоторыми значениями по умолчанию. Моя идея состояла в том, чтобы переопределить form_valid, получить последний идентификатор 1 модели, а затем создать и сохранить 2-й экземпляр:

Class NowyMag (CreateView): 
''' 
Widok pozwalajacy na dodanie nowej czesci magazynowej do listy 
''' 

model=MAG_magazyn 
fields=[ 
     (...), 
     ] 
template_name='magazyn/nowy_mag.html' 
success_url=reverse_lazy('mag_lista_mag') 

    def form_valid(self, form): 
    form.save() 
    nowy_stan=MAG_magazyn_stan(id_czesc=MAG_magazyn.objects.latest('id').id, regal=0,polka=0,stan_min=0,stan=0, alert=1) 
    nowy_stan.save() 
    return super(NowyMag, self).form_valid(form) 

, но все, что я получил это:

Exception Type: ValueError 
Exception Value: Cannot assign "20": "MAG_magazyn_stan.id_czesc" must be a "MAG_magazyn" instance. 

Могу ли я правильно думать, но есть ошибка, или есть какой-то более чистый способ получить что-то вроде этого?


немного лучшего объяснения: При создании экземпляра MAG_magazyn, я хотел бы автоматически создать MAG_magazyn_stan с идентификатором созданного MAG_magazyn и некоторые значения по умолчанию (здесь все равны 0)

ответ

2

Ваш вопрос не очень понятно, но я предполагаю, что вы используете форму, связанную с MAG_magazyn, в этом случае, вы хотите сделать что-то вроде:

def form_valid(self, form): 
    # You need to get a new object based on the form 
    self.object = form.save(commit=False) 
    ... # in case you want to modify the object before commit 
    self.object.save() 
    # not you can use it to assign to the second model 
    nowy_stan=MAG_magazyn_stan(id_czesc=self.object, ...) 
    nowy_stan.save() 

    return HttpResponseRedirect(self.get_absolute_url) # or elsewhere 
+0

Да, именно то, что моя проблема была! Спасибо :) Итак, моя проблема заключалась в том, что я привязался к назначению только идентификатора, но должен назначить self.object и django волшебным образом знает, что делать, поскольку эти модели руды связаны с OneToOneField? – Jakub

+1

У вас было две проблемы. тот, который вы упомянули, и тот факт, что объект, который вы пытались назначить, не был создан, поскольку вы переписывали метод form_valid, где он должен быть создан. Итак, первые две строки (или вы можете сделать одну строку с commit = True) являются критическими – dkarchmer

Смежные вопросы