2009-12-29 6 views
0

je l'ai déclaré deux de mes modèles de cette façon:problème de champ ForeignKey dans Django

class EmailAddress(models.Model): 
    customer = models.ForeignKey(Customer) 
    email_address = models.CharField(max_length=200) 
    def __unicode__(self): 
    return self.email_address 

class Customer(models.Model): 
. 
. 
. 
email_address = models.ForeignKey(EmailAddress) 
def __unicode__(self): 
    name = ''+str(self.title)+" "+str(self.first_name)+" "+str(self.last_name) 
    return name 

L'idée est qu'un client peut avoir plusieurs adresses e-mail associées à lui/elle ... le problème est de savoir comment faire ceci correctement ... comme vous pouvez le voir de mon code ci-dessus, le champ de clé étrangère client doit être après la classe de client, mais le champ de clé étrangère d'adresse de courrier électronique doit être après la classe EmailAddress ... comment trier cette problème?

+3

Non lié à votre question, mais il y a un bug sérieux avec votre méthode unicode - il ne retourne pas unicode. Si l'un de vos clients a des caractères non ASCII dans son titre ou son nom, Python se bloque horriblement. Faites ceci à la place: 'name = u '% s% s% s'% (self.title, self.first_name, self.last_name)' –

+0

merci pour le conseil Daniel – Stephen

Répondre

2

Je ne vois pas pourquoi vous voulez utiliser un ForeignKey dans EmailAddress.
Extrait du développement web Python avec Django:

Les clés étrangères sont généralement utilisés pour définir un à plusieurs (ou plusieurs à un) relations. Dans l'exemple suivant, un livre a un seul auteur et un auteur peut avoir plusieurs livres.

class Author(models.Model): 
    name = models.CharField(max_length=100) 

class Book(models.Model): 
    title = models.CharField(max_length=100) 
    author = models.ForeignKey(Author) 
2

Il suffit d'ajouter les guillemets simples autour de client:

class EmailAddress(models.Model): 
    customer = models.ForeignKey('Customer') 
    email_address = models.CharField(max_length=200) 
    def __unicode__(self): 
    return self.email_address 
4

Il y a une grave lacune logique ici - ForeignKey de Customer à Email signifierait que chaque client a un seul email. Vous voulez sauter cette foreignkey alltogether:

class Email(models.Model): 
    customer = models.ForeignKey(Customer, related_name='email_addresses') 

puis il suffit de faire customer.email_addresses pour obtenir une liste de tous les e-mails. Vous n'avez pas besoin d'un autre ForeignKey, django utilise les relations définies dans un modèle (contrairement à RoR et autres frameworks MVC)

0

La réponse de Menda est correcte. Il n'y a pas vraiment de problème de commande car le modèle client n'a pas besoin d'un champ ForeignKey. Supprimez simplement cela et retournez l'ordre dans lequel les classes sont définies.

class Customer(models.Model): 
    pass 

class EmailAddress(models.Model): 
    customer = models.ForeignKey(Customer) 
    email_address = models.CharField(max_length=200) 

Il existe également un champ de messagerie Django que vous pouvez utiliser. Voir Django EmailField. Je voulais juste mentionner que dans le cas où il pourrait ajouter de la valeur à votre application.

Questions connexes