72 votes

Comment puis-je limiter GenericForeignKey de Django à une liste de modèles?

Existe-t-il un moyen de dire à Django qu'un modèle ayant un type de contenu GenericForeignKey peut uniquement pointer vers des modèles à partir d'une liste prédéfinie? Par exemple, j'ai 4 modèles: A, B, C, D et un modèle X contenant une GenericForeignKey. Puis-je dire à X que seuls les caractères A et B sont autorisés pour GenericForeignKey?

134voto

mumino Points 911

Par exemple, vos applications sont app et app2 et il existe des modèles A, B et app, des modèles C, D dans app2. vous voulez voir uniquement app.A et app.B et app2.C

     class TaggedItem(models.Model):
        tag = models.SlugField()
        limit = models.Q(app_label = 'app', model = 'a') | models.Q(app_label = 'app', model = 'b') | models.Q(app_label = 'app2', model = 'c')
        content_type = models.ForeignKey(ContentType, limit_choices_to = limit)
        object_id = models.PositiveIntegerField()
        content_object = generic.GenericForeignKey('content_type', 'object_id')
 

utilisez limit_choices_to sur ForeignKey.

Consultez la documentation de Django pour plus de détails et les objets Q, app_label. vous devez écrire le bon app_label et le bon modèle. ceci est juste un extrait de code

plus: je pense que vous écrivez mal app_label. cela peut vous aider.

     from django.contrib.contenttypes.models import ContentType
    for c in Contenttype.objects.all():
        print c.app_label, c.model
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X