49

¿Hay alguna manera de decirle a django que un modelo que tenga un tipo de contenido GenericForeignKey solo puede apuntar a modelos de una lista predefinida? Por ejemplo, tengo 4 modelos: A, B, C, D y un modelo X que contiene un GenericForeignKey. ¿Puedo decirle a X que solo A & B están permitidos para GenericForeignKey?¿Cómo puedo restringir GenericForeignKey de Django a una lista de modelos?

Respuesta

93

Por ejemplo, sus aplicaciones son aplicación y aplicación2 y hay modelos A, B en la aplicación y hay modelos C, D en la aplicación2. desea ver solamente app.A y App.B y 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') 

uso limit_choices_to en ForeignKey.

revise django docs para obtener más información y objetos Q, app_label. necesita escribir la etiqueta_aplicación adecuada y el modelo. Esto es solo un fragmento de código

plus: Creo que escribes la etiqueta de la aplicación incorrecta. Esto puede ayudarte.

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

Pero, la interfaz de administración no parece usar esto, para su campo de elección. ¿Porqué es eso? – Geo

+0

Lo comprobé por el lado de administración y funciona con el administrador predeterminado, como se esperaba. tal vez hiciste algún pequeño error tipográfico allí. No sé tu problema. – mumino

+0

En mi administrador, después de agregar su límite, las opciones de la selección de GenericForeignKey desaparecen. Solo me queda "---". ¿Podría publicar una captura de pantalla con las elecciones de selección de su administrador? – Geo

Cuestiones relacionadas