2009-04-08 6 views
18

Y at-il un moyen de définir une clé étrangère dans django à un champ d'un autre modèle? Par exemple, imaginez que j'ai un objet ValidationRule. Par exemple, imaginez que j'ai un objet ValidationRule. Et je veux que la règle définisse quel champ dans un autre modèle doit être validé (ainsi que d'autres informations, comme si elle peut être nulle, un type de données, une plage, etc.)Modèle Django définir la clé étrangère à un champ d'un autre modèle

Y at-il un moyen stocker ce mappage au niveau du champ dans django?

Répondre

16

Oui et non. La relation FK est décrite au niveau de la classe et reflète l'association FK dans la base de données, de sorte que vous ne pouvez pas ajouter d'informations supplémentaires directement dans le paramètre FK.

Au lieu de cela, je recommande d'avoir une chaîne qui contient le nom du champ sur l'autre table:

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

De cette façon, vous pouvez obtenir le champ avec:

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

Notez que si vous utilisez des champs plusieurs-à-plusieurs (plutôt qu'un un-à-plusieurs), il existe un support intégré pour la création de tables intermédiaires personnalisées pour contenir des métadonnées avec l'option through.

65

Je ne l'ai pas essayé, mais il semble que depuis Django 1.0, vous pouvez faire quelque chose comme:

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

Documentation pour c'est here.

+4

+1 - belle trouvaille! –

+2

s'il vous plaît lire la question à nouveau. – ultrajohn

+0

Exactement ce que je cherchais. J'espère que cela signifie aussi que je peux faire 'foo.foo_bar = value_bar'. Sans avoir à interroger Bar –

Questions connexes