【问题标题】:save duplicated records in Django在 Django 中保存重复的记录
【发布时间】:2014-10-20 21:19:45
【问题描述】:

我开始学习 django 并且遇到了这个新手问题: 我要模型模型之间的关系是一对多的。一个提供者必须有多个 DetailLoad。

我为 DetailLoad 创建了一个表单,我只需要保存 id_proveedor (FK)、anio 和 mes。 但是,当我尝试保存表单时,会显示验证错误“此提供程序的详细加载已存在”

模型.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))

即使是重复的行,我也需要能够保存记录、选择提供者并填写其他两个字段。 顺便说一句,是一个遗留数据库,这些表没有约束或任何其他表的关系。

提前致谢

【问题讨论】:

    标签: django django-models django-forms


    【解决方案1】:

    DetailLoad 模型中,您设置Proveedor ForeignKey 并使其成为主键。主键始终是唯一的,这就是您不能添加另一个条目的原因。您需要从以下位置删除primary_key=True

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

    在 django 中,主键是自动生成的,您不需要在模型中定义它们。可以使用idpk 属性访问主键。

    【讨论】:

    • 谢谢,我听从了你的建议,但现在我收到错误 ORA-00904: "MPC_DETAIL_LOAD"."ID": invalid identifier
    • 要执行此操作,您应该安装和使用南应用程序(如果 Django 版本 = 1.7),或者您应该通过一些 oracle 工具手动更改表。因为如果您在模型中删除 primary_key=True,您的数据库中的数据不会改变。看看这个问题stackoverflow.com/questions/19339464/…
    猜你喜欢
    • 2022-11-30
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    • 2013-10-13
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多