2010-03-27 10 views
10

En el siguiente modelo:consultas clave Django Exteriores

class header(models.Model): 
    title = models.CharField(max_length = 255) 
    created_by = models.CharField(max_length = 255) 

    def __unicode__(self): 
     return self.id() 

class criteria(models.Model): 
    details = models.CharField(max_length = 255) 
    headerid = models.ForeignKey(header) 

    def __unicode__(self): 
     return self.id() 

class options(models.Model): 
    opt_details = models.CharField(max_length = 255) 
    headerid = models.ForeignKey(header) 

    def __unicode__(self): 
     return self.id() 

Si hay una fila en la base de datos de cabecera de la tabla como Id=1, title=value-mart , createdby=CEO

¿Cómo consulto criterios y tablas de opciones para obtener todos los valores relacionado con la tabla de encabezado id = 1

También puede alguien sugerir un buen enlace para ejemplos de consultas.

Respuesta

9

Antes que nada, no use id en los nombres, porque es confuso. Ese campo no es la ID, es el objeto mismo. (Si usted tiene un campo ref se crea automáticamente un campo ref_id)

options.objects.filter(header=a_header) 

se consulta como cualquier valor, en algún caso cabecera es el valor que se está filtrando.

3

Sugeriría que nos traten un coding style y una convención de nomenclatura que sea más parecida a la que se ve en la documentación de Django para Models. Algo de la misma familia:

class Header(models.Model): 
    ... 

class Criteria(models.Model): 
    details = model.CharField(max_length=255) 
    header = models.ForeignKey(Header) 

y luego los de la consulta como sea necesario:

# find Criteria for a given header 
value_mart = Header.objects.get(id=1) 

# ... via an instance of Header. 
value_mart.criteria_set.all() 

# ... or with a filter(). 
Criteria.objects.filter(header=value_mart) 
Criteria.objects.filter(header_id=1) 

La documentación para many-to-one relationships también hace referencia a un usage example.

20

Ironfroggy es correcto, pero hay otra forma más obvia de obtener los objetos relevantes options y criteria. Django crea automáticamente una 'relación inversa' para cada clave externa que apunta a un modelo, y ese es generalmente el nombre del modelo relacionado más _set. Por lo tanto:

mycriteria.options_set.all() 
mycriteria.header_set.all() 

le dará todas las options y header objetos relacionados con un objeto mycriteriacriteria.

Además, una nota sobre el estilo: como señaló ironfroggy, no debe usar id en los campos de clave externa, pero también debe usar el estilo con mayúscula para sus clases modelo, para que pueda ver una diferencia entre la clase Criteria y una instancia particular criteria.

En términos de enlaces, el Django documentation es excelente y explica todo esto.

5

Parece que está buscando Following relationships "backward".

Usted puede obtener el objeto de encabezado que desea filtrar y usar algo como

obj = Header.objects.get(title="value-mart", "createdby=CEO") 
obj.criteria_set.all() 

Mira el documentation para obtener información más detallada

Cuestiones relacionadas