2011-04-25 12 views
12

Esta vez creo que no soy yo el estúpido sino un conflicto real. Tengo el código de abajo (simplificado):Django syncdb conflictivo related_name cuando se usa herencia y ForeignKey

from django.db import models 

class Alpha(models.Model): 
    relation = models.ForeignKey('Delta', related_name = 'reverse_relation', blank = True, null = True) 

    class Meta: 
     abstract = True 

class Beta(Alpha): 
    pass 

class Gamma(Alpha): 
    pass 

class Delta(models.Model): 
    pass 

El problema es que Delta.reverse_relation podría hacer referencia a una instancia de Beta o una instancia de Gamma. Tendría que proporcionar de algún modo varios valores related_name (o uno que dependa del nombre de la clase). Creo que el problema está claro, pero para estar completo, el error (al ejecutar syncdb): app.beta: Accesor para el campo 'relation' choques con el campo relacionado 'Delta.reverse_relation'. Agregue un argumento related_name a la definición de 'relación'.
app.beta: El nombre de la consulta inversa para el campo 'relación' choca con el campo relacionado 'Delta.reverse_relation'. Agregue un argumento related_name a la definición de 'relación'.
app.gamma: Accesor para el campo 'relación' choca con el campo relacionado 'Delta.reverse_relation'. Agregue un argumento related_name a la definición de 'relación'.
app.gamma: El nombre de la consulta inversa para el campo 'relación' choca con el campo relacionado 'Delta.reverse_relation'. Agregue un argumento related_name a la definición de 'relación'.

¿Es posible colocar ForeignKey en el Alpha padre, o es la única forma de cortar y pegar este código en Beta y Gamma? Prefiero no hacer eso porque de alguna manera se derrota el punto de herencia si no puedo definir en el padre la mitad de los campos que comparten todos los niños.

¡Cualquier ayuda está muy mal aplicada!

(Si alguien puede comentar con esto los mensajes de error que no están en una caja de código Voy a arreglar eso.)

+1

encontrado mi propia pregunta a través de Google de nuevo. Ocurre más de lo que me gustaría admitir. – Mark

Respuesta

21

Creo que se encuentra el siguiente consejo en la documentación de Django útil y relevante: https://docs.djangoproject.com/en/1.7/topics/db/models/#be-careful-with-related-name

cambiar esencialmente la declaración del campo relación con:

relation = models.ForeignKey('Delta', related_name="%(app_label)s_%(class)s") 

mejor de la suerte ...

+0

Gracias por la respuesta, espero que ayude a más personas a encontrar esta solución. – Mark

+0

¿Qué sucede si tengo dos claves externas con las mismas etiquetas de aplicación? No puedo encontrar la respuesta. –

+0

El 'related_name' es simplemente una cadena de plantillas con palabras clave' app_label' y 'class'. Si es necesario, puede especificar 'related_name' para la primera foreign_key como' "% (app_label) s _% (class) s_fk1_set" 'y para la segunda como' "% (app_label) s _% (class) s_fk2_set" '(o cualquier otra cadena de tu elección) – banerjs

Cuestiones relacionadas