2014-01-08 45 views
0

我有這些表:Django的,表繼承:插入數據

class OpeDatos(models.Model): 
    id_dato = models.IntegerField(primary_key=True) 
    id_usuario = models.ForeignKey(SisUsuarios, db_column='id_usuario') 
    id_region = models.ForeignKey(SisRegiones, db_column='id_region') 
    titulo = models.CharField(max_length=70, blank=True) 
    class Meta: 
     managed = False 
     db_table = 'ope_datos' 

class OpeProductos(OpeDatos): 
    id_producto = models.IntegerField(primary_key=True) 
    iddato = models.OneToOneField(OpeDatos, primary_key=True, db_column="id_dato", parent_link=True) 
    id_producto_tipo = models.ForeignKey(DefProductosTipos, db_column='id_producto_tipo') 
    class Meta: 
     managed = False 
     db_table = 'ope_productos' 

我想插入數據:

from apps.inicio.models import SisUsuarios, SisRegiones, OpeDatos 

usuario = SisUsuarios.objects.get(pk=1) 
region = SisRegiones.objects.get(pk=1) 
datos = OpeDatos() 
datos.id_usuario = usuario 
datos.id_region = region  
datos.save() 
producto = OpeProductos() 
producto.iddato = datos.id_dato 
producto.save() 

顯示如下消息:

ValueError異常在/ PRODUCTOS /添加/

無法賦值無:「OpeProductos.iddato」不允許空值。

請問你能幫助我嗎?

+0

爲什麼你有'OpeProductos'繼承'OpeDatos'?這當然不是你想要做的,特別是首先有一個OneToOne字段與他們相關,其次是非託管模型。 –

回答

1

當創建一個id手動你應該使用下拉列表AutoField代替IntegerField

id_dato = models.AutoField(primary_key=True) 

https://docs.djangoproject.com/en/1.6/ref/models/fields/#autofield

正在發生的事情是,因爲你沒有明確定義「DATOS」對象的ID它沒有一個,然後producto抱怨,因爲該鍵不能有空值。

下拉列表AutoField應該解決這個問題

+0

我做了改變。 顯示以下消息:/ productos/add/ 上的IntegrityError(無法添加或更新子行:外鍵約束失敗id_usuario')參考'sis_usuarios'('id_usuario')ON DELETE NO ACTION ON UPDATE NO ACTION)') – user3171731

0

我很驚訝它不會在早期線路故障:datos.save()因爲你還沒有主鍵datos.id_dato

通常在Django提供的價值,你就需要使用一個AutoField得到一個自動遞增的主鍵。

另外,您不應在OpeProductos.iddato字段中指定primary_key=True,每個模型只能有一個主鍵。

然後,您所看到的錯誤是由於datos.id_datoNone這一事實,因爲您在保存datos實例之前未提供任何值。