2012-01-21 9 views
8

Estoy tratando de averiguar cómo diseñar dos de mis modelos de Django para que cuando se guarde un nuevo modelo en la base de datos, su clave principal se incremente de manera tal que sea el siguiente valor más alto para todos los registros con la misma clave externa.Django Aumento automático de modelo Clave principal basada en clave externa

Se parece mucho a this question asked, pero me pregunto cómo lo harías en Django. He aquí un extracto de la cuestión que demuestra una situación similar:

id | job_id | title 
0  1  hi 
1  1  hello 
2  1  goodbye 
0  2  hi 
1  2  hello 

you can't have multiple primary keys in a Django model y se puede utilizar unique_together, pero la documentación dice que utiliza la UNIQUE declaración equivalente en los estados CREATE. Habría

class ModelA(models.Model): 
    key = models.PositiveIntegerField(primary_key = True) 
    fk = models.ForeignKey(ModelB) 

    def Meta(self): 
     unique_together = ("key", "fk") 

en los modelos de trabajar con this answer para lograr lo que estoy buscando? La relación entre los modelos es una ModelA que tiene muchos ModelB s, pero cada ModelB tiene solo un ModelA.

+1

Ese primer párrafo no se analizó. –

+0

@ IgnacioVazquez-Abrams, reformulé el primer párrafo y agregué un ejemplo. ¿Tiene más sentido ahora? – Dirk

Respuesta

8

Dirk, tienes que hacer algunos cambios en el modelo (si está permitido) como Ignacio ha dicho. Por lo tanto, ModelA ahora debe verse de la siguiente manera.

class ModelA(models.Model): 
    key = models.PositiveIntegerField() 
    fk = models.ForeignKey(ModelB) 

    def Meta(self): 
     unique_together = ("key", "fk") 

    def save(self, *args, **kwargs): 
     key = cal_key(self.fk) 
     self.key = key 
     super(ModelA, self).save(*args, **kwargs) 

Como, se puede ver, tengo overridden the default save method para calcular el valor de la clave de un método cal_key teniendo fk as argument. Por lo tanto, defina el siguiente método cal_key a continuación en el archivo de modelos.

def cal_key(fk): 
    present_keys = ModelA.objects.filter(fk=fk).order_by('-key').values_list('key',flat=True) 
    if present_keys: 
     return present_keys[0]+1 
    else: 
     return 0 

El método cal_key indica claramente lo que realmente necesita.

+0

Gracias Sandip. Respondí tu respuesta porque era más portátil que la respuesta de Ignacio. – Dirk

+0

Si su aplicación es de subprocesos múltiples, ¿es posible que esta solución pueda generar el error de validación unique_together porque intenta asignar la misma clave a dos características diferentes, si se guardan en el mismo tiempo? –

0

puede probar esto:

AutoFile 

puede encontrar here para más detalles.

Cuestiones relacionadas