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.