2009-05-28 5 views
5

J'essaie de créer une table de mappage entre deux références génériques (content_type), une pour les "agents" et une pour les "ressources".Modèle django avec deux clés étrangères génériques (content_type)?

donc je prends la manière habituelle, je fais une clé étrangère générique:

content_type = models.ForeignKey(ContentType) 
object_id = models.PositiveIntegerField() 
resource = generic.GenericForeignKey('content_type', 'object_id') 

Et j'essaie de faire un modèle avec deux.

agent_content_type = models.ForeignKey(ContentType) 
agent_object_id = models.PositiveIntegerField() 
agent = generic.GenericForeignKey('agent_content_type', 'agent_object_id') 

resource_content_type = models.ForeignKey(ContentType) 
resource_object_id = models.PositiveIntegerField() 
resource = generic.GenericForeignKey('resource_content_type', 'resource_object_id') 

Mais cela jette maintenant les erreurs suivantes:

myapp.mymodel: accessoir pour le champ 'resource_content_type' affrontements avec domaine connexe 'ContentType.mymodel_set'. Ajoutez un argument related_name à la définition pour 'resource_content_type'.

Et similaire pour l'agent.

Que se passe-t-il ici? Et que dois-je faire?

acclamations

phil

Répondre

10

Avez-vous essayé de faire ce que le message d'erreur vous dit de faire - ajouter un argument related_name?

agent_content_type = models.ForeignKey(ContentType, related_name='mymodel_agent') 

Edit: La raison pour laquelle il arrive est que chaque fois que vous définissez une clé étrangère, Django donne automatiquement le modèle cible un attribut pour faire la recherche inversée. Par défaut, cela donne le nom de la table associée + - donc si votre table article a un FK à section, section obtiendra un attribut article_set pour la recherche inversée.

Maintenant, si vous avez deux dans le même FKs pointage modèle au même modèle cible, Django va essayer de leur donner à la fois l'attribut foo_set, conduisant à une collision. D'où le message d'erreur, qui vous dit de définir l'attribut related_name manuellement.

+0

merci, cela fonctionne. Mais j'espérais que quelqu'un pourrait expliquer pourquoi. Ou plutôt, pourquoi l'ambiguïté apparaît quand j'ai deux clés génériques étrangères mais pas une seule? – interstar

+0

Edité pour ajouter l'explication. –