я пытаюсь получить Джанго автоматически создать экземпляр 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)
Да, именно то, что моя проблема была! Спасибо :) Итак, моя проблема заключалась в том, что я привязался к назначению только идентификатора, но должен назначить self.object и django волшебным образом знает, что делать, поскольку эти модели руды связаны с OneToOneField? – Jakub
У вас было две проблемы. тот, который вы упомянули, и тот факт, что объект, который вы пытались назначить, не был создан, поскольку вы переписывали метод form_valid, где он должен быть создан. Итак, первые две строки (или вы можете сделать одну строку с commit = True) являются критическими – dkarchmer