2016-08-10 3 views
0

Ich möchte wie diese eine Abfrage auf die django User-Tabelle tun:Python konvertieren String Klasse

u = User.objects.filter(member__in = member_list) 

wo:

class Member(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    dob = models.DateField('Date of Birth', blank=True, null=True) 

und member_list eine Liste der in Frage kommenden Mitglieder.

Die Abfrage funktioniert gut, aber das Problem ist, ich eigentlich nicht wissen, das Modell member wird member genannt. Es könnte alles genannt werden.

Ich speichere den Namen des Modells, das ich möchte in einem Modell namens Category. Ich habe eine Verbindung zum Namen des Modells durch content_type. Category ist definiert als:

class Category(models.Model): 
    name = models.CharField('Category', max_length=30) 
    content_type = models.ForeignKey(ContentType) 
    filter_condition = JSONField(default="{}", help_text=_(u"Django ORM compatible lookup kwargs which are used to get the list of objects.")) 
    user_link = models.CharField(_(u"Link to User table"), max_length=64, help_text=_(u"Name of the model field which links to the User table. 'No-link' means this is the User table."), default="No-link") 

    def clean (self): 
     if self.user_link == "No-link": 
      if self.content_type.app_label == "auth" and self.content_type.model == "user": 
       pass 
      else: 
       raise ValidationError(
        _("Must specify the field that links to the user table.") 
        ) 
     else: 
      if not hasattr(apps.get_model(self.content_type.app_label, self.content_type.model), self.user_link): 
       raise ValidationError(
        _("Must specify the field that links to the user table.") 
        )    

    def __unicode__(self): 
     return self.name 

    def _get_user_filter (self): 
     return str(self.content_type.app_label)+'.'+str(self.content_type.model)+'.'+str(self.user_link)+'__in' 

    def _get_filter(self): 
     # simplejson likes to put unicode objects as dictionary keys 
     # but keyword arguments must be str type 
     fc = {} 
     for k,v in self.filter_condition.iteritems(): 
      fc.update({str(k): v}) 
     return fc 

    def object_list(self): 
     return self.content_type.model_class()._default_manager.filter(**self._get_filter()) 

    def object_count(self): 
     return self.object_list().count() 

    class Meta: 
     verbose_name = _("Category") 
     verbose_name_plural = _("Categories") 
     ordering = ('name',) 

So kann ich den Namen des Modells abzurufen, die auf Benutzer verbindet, aber ich muss dann es in eine Klasse umwandeln, die ich in einer Abfrage enthalten kann.

Ich kann ein Objekt erstellen x = category.content_type.model_class(), die mir <class 'cltc.models.Member'> gibt, aber wenn ich sie eine Abfrage durchführen s = User.objects.filter(x = c.category.object_list()) erhalte ich die Fehler Kann Stichwort nicht lösen ‚x‘ in das Feld.

Alle Gedanken herzlich willkommen.

Antwort

2

Die linke Seite des Filterarguments ist ein Schlüsselwort, kein Python-Objekt, also wird x als 'x' behandelt, und Django erwartet ein Feld namens x.

Um dies zu umgehen, können Sie sicherstellen, dass x ein String ist, und dann die Python **kwarg Syntax:

s = User.objects.filter(**{x: c.category.object_list()}) 

Dank https://stackoverflow.com/a/4720109/823020 dafür.

Verwandte Themen