2009-04-08 43 views
18

¿Hay alguna forma de establecer una clave foránea en django en un campo de otro modelo?Django Modelo establece la clave foránea en un campo de otro Modelo

Por ejemplo, imagine que tengo un objeto ValidationRule. Y quiero que la regla defina qué campo de otro modelo se va a validar (así como otra información, como si puede ser nulo, un tipo de datos, rango, etc.)

¿Hay alguna manera? para almacenar esta asignación de nivel de campo en django?

Respuesta

16

Sí y no. La relación FK se describe en el nivel de clase y refleja la asociación FK en la base de datos, por lo que no puede agregar información adicional directamente en el parámetro FK.

En su lugar, lo recomiendo tener una cadena que contiene el nombre del campo en la otra mesa:

class ValidationRule(models.Model): 
    other = models.ForeignKey(OtherModel) 
    other_field = models.CharField(max_length=256) 

De esta manera, se puede obtener el campo con:

v = ValidationRule.objects.get(id=1) 
field = getattr(v, v.other_field) 

Tenga en cuenta que si está utilizando campos de Muchos a Muchos (en lugar de uno a varios), existe soporte integrado para crear tablas intermedias personalizadas para contener metadatos con la opción through.

65

No he probado esto, pero parece que desde Django 1.0 se puede hacer algo como:

class Foo(models.Model): 
    foo = models.ForeignKey(Bar, to_field='bar') 

Documentación de esto es here.

+4

+1 - buen hallazgo! –

+2

por favor lea la pregunta nuevamente. – ultrajohn

+0

Exactamente lo que estaba buscando. Espero que esto también signifique que puedo hacer 'foo.foo_bar = value_bar'. Sin tener que consultar la barra –

Cuestiones relacionadas