2009-11-18 4 views
17

Je suis en train de créer une base de données django qui enregistre tous mes achats de bandes dessinées, et j'ai rencontré quelques problèmes. J'essaie de modéliser la relation entre un problème comique et les artistes qui y travaillent. Un numéro de bande dessinée a un ou plusieurs artistes travaillant sur le problème, et un artiste travaillera sur plus d'un seul numéro. En outre, l'artiste a un rôle en relation avec ce qu'ils ont fait sur le créateur de bande dessinée (tout le travail sur cette question), écrivain (a écrit le script), tiroir (dessiné la bande dessinée complète), crayons, encres, couleurs ou texte, et il peut y avoir plusieurs artistes dans un rôle donné.Plusieurs à plusieurs relations avec des données supplémentaires sur la relation

Cela me donne un modèle de base de données comme: Database model

Je traduis alors ce dans le modèle Django suivant. Comme je l'ai besoin de données supplémentaires sur la relation, je crois que je dois utiliser une classe distincte pour gérer la relation, et tenir le plus

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

    def __unicode__(self): 
     return self.name 

class ComicIssue(models.Model): 
    issue_number = models.IntegerField() 
    title = models.TextField() 
    artists = models.ManyToManyField(Artist, through='IssueArtist') 

    def __unicode__(self): 
     return u'issue = %s, %s' % (self.issue_number, self.title) 

class IssueArtist(models.Model): 
    roles = ((0, "--------"), 
       (1, "Creator"), 
       (2, "Writer"), 
       (3, "Drawer"), 
       (4, "Pencils"), 
       (5, "Inks"), 
       (6, "Colours"), 
       (7, "Text"), 
      ) 
    artist = models.ForeignKey(Artist) 
    issue = models.ForeignKey(ComicIssue) 
    role = models.IntegerField(choices = roles) 

Mes questions sont les suivantes:

1) Est-ce que cela semble un bon façon de modéliser cela? 2) Si je n'utilise pas la fonction through='IssueArtist', je peux ajouter des relations en utilisant la fonction artists.add(). Si je l'utilise, j'obtiens une erreur 'ManyRelatedManager' object has no attribute 'add'. Dois-je gérer manuellement la relation en créant des instances IssueArtist() et en recherchant explicitement dans la table de relations? NB. J'utilise Django 1.0, en ce moment

Répondre

22

Je vous recommande de consulter la section "CHAMPS SUPPLÉMENTAIRES SUR LES RELATIONS NOMBREUSES" dans le Django documentation - il couvre exactement votre question.

1: oui, créer un modèle intermédiaire est la solution. 2: De la documentation: "Contrairement aux champs plusieurs-à-plusieurs normaux, vous ne pouvez pas utiliser l'ajout, la création ou l'affectation pour créer des relations" - Au lieu d'ajouter l'artiste à un problème, faites-le de l'intermédiaire modèle:

some_artist = Artist.objects.get(name='some name') 
some_issue = Issue.objects.get(tile='some tite') 
IssueArtist.objects.create(artist= some_artist, issue = some_issue, role=1) 
+0

Ce lien est précisément ce que je cherchais et ne pas trouver. Je pense que je dois regarder mes compétences de recherche. –

+0

Ceci est une véritable partie de «mer agitée» de Django. Le message d'erreur est trompeur et les méthodes add/create devraient fonctionner comme prévu. Merci d'avoir posté cette réponse. – Rich

+2

juste en soulignant que a.save() est inutile si vous utilisez la méthode create(). https://docs.djangoproject.com/fr/dev/ref/models/querysets/#django.db.models.query.QuerySet.create –

Questions connexes