2014-10-20 3 views
0

Я начинаю изучать django, и у меня есть эта проблема с новичком: Мне нужно моделировать отношение между моделью - одно для многих. У одного провайдера должно быть много DetailLoad.сохранить дублированные записи в Django

Я создаю форму для DetailLoad, где мне нужно только сохранить id_proveedor (FK), anio и mes. Но когда я пытаюсь сохранить форму, отображается ошибка проверки "detail Load для этого провайдера уже существует".

Models.py

class Provider(models.Model): 
     id_proveedor = models.AutoField(primary_key=True, db_column='id_proveedor') 
     nombre = models.CharField(max_length=50, blank=True) 
     tipo = models.CharField(max_length=50, blank=True) 
     asignado_a = models.CharField(max_length=15, blank=True, verbose_name='Asignado a') 
     moneda = models.CharField(max_length=1, blank=True) 
     class Meta: 
      managed = False 
      db_table = 'mpc_proveedores' 

     def __unicode__(self): 
      return self.nombre 

class DetailLoad(models.Model): 
    id_proveedor = models.ForeignKey(Proveedor,db_column='id_proveedor', primary_key=True, verbose_name='Proveedor') 
    anio = models.IntegerField(blank=True, null=True) 
    mes = models.IntegerField(blank=True, null=True) 
    f_carga = models.DateField(blank=True, null=True, verbose_name='Fecha de carga') 
    usuario = models.CharField(max_length=15, blank=True) 
    registros = models.FloatField(blank=True, null=True,verbose_name='Cant. de Registros') 
    num_codigos = models.IntegerField(blank=True, null=True,verbose_name='Cant. codigos') 
    lista_codigos = models.CharField(max_length=2500, blank=True, verbose_name='Lista de Codigos') 
    class Meta: 
     managed = False 
     db_table = 'mpc_detalle_carga_archivo' 

определение формы, которую я использую, чтобы сохранить данные:

class NewDetLoadForm(forms.ModelForm): 
     def __init__(self,*args,**kwargs): 
     super(NewDetRecForm,self).__init__(*args,**kwargs) 
     self.helper = FormHelper(self) 
     self.helper.layout.append(Submit('save','Grabar')) 
     self.helper.layout = Layout(
     Fieldset('', 
       'id_proveedor', 
       'anio', 
       'mes', 
       Submit('save','Grabar'), 
       ) 
     ) 


     class Meta: 
     model = DetalleRecepcion 

мой взгляд:

def NewDetLoadView(request): 
    if request.method == "POST": 
     drform = NewDetLoadForm(request.POST or none) 
     if drform.is_valid(): 
      drform.save() 
      return HttpResponseRedirect('/monitor/') 
    else: 
     drform = NewDetLoadForm() 

    return render_to_response('newdetload.html',locals(), 
           context_instance=RequestContext(request)) 

мне нужно быть в состоянии сохранять записи, выбирать поставщика и заполнять два других поля, даже если это повторяющиеся строки. Кстати, это устаревшая база данных, таблицы не имеют ограничений или каких-либо отношений других таблиц.

Заранее спасибо

ответ

1

В DetailLoad модели вы устанавливаете Proveedor ForeignKey, а также делает его первичным ключом. Первичные ключи всегда уникальны, поэтому вы не можете добавить другую запись. Вы должны удалить primary_key=True из:

id_proveedor = models.ForeignKey(Proveedor,db_column='id_proveedor', primary_key=True, verbose_name='Proveedor') 

В Джанго первичные ключи генерируются автоматически, и вам не нужно определить их в своих моделях. К основным ключам может быть подключен атрибут id или pk.

+0

Спасибо, я следую вашим советам, но теперь я получаю сообщение об ошибке ** ORA-00904: «MPC_DETAIL_LOAD». «Идентификатор»: недопустимый идентификатор ** – Joseleg

+0

Чтобы выполнить это, вы должны установить и использовать южное приложение (если версия Django < 1.7) или выполнить миграцию (если версия Django> = 1.7), или вы должны вручную изменить таблицу с помощью некоторых инструментов oracle. Поскольку данные в вашей БД не изменились бы, если бы вы просто удалили 'primary_key = True' в своей модели. Взгляните на этот вопрос http://stackoverflow.com/questions/19339464/ora-00904-id-invalid-identifier – madzohan