2011-09-11 3 views
0

Voici le code que je voudrais travailler à mettre en place deux modèles:Django: Many-to-One relations

from django.db import models 

class A(models.Model): 
    x = models.CharField(max_length = 2) 

class B(models.Model): 
    a = models.ForeignKey(A) 
    y = models.CharField(max_length = 2, default = a.x) 

Cependant, quand je lance python manage.py syncdb, il me dit que cet objet ForeignKey a n'a pas d'attribut x. J'ai cherché dans la documentation de Django et jusqu'ici j'ai été incapable de trouver ma réponse. Espérons que la signification du code est claire. Comment puis-je réellement mettre en œuvre cela?

Merci d'avance!

+0

Comme une question totalement indépendante, comment stackoverflow colorie automatiquement le code? –

+1

http://code.google.com/p/google-code-prettify/ – Vamsi

Répondre

3

Vous ne pouvez pas mettre des variables dans un attribut par défaut de champ - il doit être une constante ou une appelable.

Si vous avez vraiment besoin de faire cela, je suppose que d'une façon serait de le faire en __init__:

class B(models.Model): 
    def __init__(self, *args, **kwargs): 
     super(B, self).__init__(*args, **kwargs) 
     if self.a and not self.b: 
      self.b == self.a.x 

mais je dois dire que je ne vois pas pourquoi vous voulez, comme vous » recopiez juste une valeur qui est déjà directement accessible via a.x.

+0

Dans mon cas particulier, «A» représente un utilisateur et «B» représente un message. 'x' est un champ qu'un utilisateur peut remplir * facultativement *, mais je ne veux pas les obliger à le remplir. Cependant, s'ils veulent faire un post, je leur demande de remplir ce champ pour le poste en question, auquel cas, * si * ils ont rempli ce champ pour leur profil d'utilisateur, je veux que ce soit la valeur par défaut valeur pour le choix. Compte tenu de cela, du point de vue de la conception, pensez-vous que c'est une bonne idée d'utiliser le code que vous avez fourni? –

+1

Ceci est probablement une question distincte, mais je dirais que votre explication est logique et que la charfield/foreign key est la bonne structure; * cependant * la valeur par défaut n'appartient pas du tout au modèle, mais dans le formulaire que vous utilisez pour créer le message. –

0

Pour définir un nombre à une relation, vous devez utiliser django.db.models.ForeignKey.

a= models.ForeignKey(A) 
+0

Désolé pour ça. C'était en fait une faute de frappe. Je vais éditer le post tout de suite. –