查询字段作为字符串?

Tho*_*rzl 1 django django-models django-queryset

我想查询作为字符串的特定字段的模型。

演示:

class Foo(models.Model):
    someones_name = models.CharField(max_length=100)
    anothers_name = models.CharField(max_length=100)

# python shell:
>> Foo.objects.get(pk=1).someones_name
u'Cpt. Hook'
>> Foo.objects.get(pk=1).anothers_name
u'Peter Pan'
Run Code Online (Sandbox Code Playgroud)

现在 - 我在一个变量中输入了字段的名称 someones_name

>> field_name = 'someones_name'
Run Code Online (Sandbox Code Playgroud)

那么,如何使用该 field_name 变量对 Foo-Model 执行几乎相同的查询?如果真的有这种可能吗?


编辑

我不想用那个 field_name 进行查询。我想要 field_name 中给出的字段的确切值。我知道我可以做这样的事情

query = Foo.objects.get(pk=1)
query.someones_name
query.anothers_name
Run Code Online (Sandbox Code Playgroud)

我所需要的只是获取我从._meta.fields(从另一个模型)动态接收的这个特定字段作为字符串。

在 RAW-SQL 中,类似于: 'SELECT %s FROM foo where pk = 1' % field_name

Ser*_*ney 5

field_name = 'someones_name'
Foo.objects.get(**{field_name: 'Cpt. Hook'})
Run Code Online (Sandbox Code Playgroud)

它等于:

Foo.objects.get(someones_name='Cpt. Hook')
Run Code Online (Sandbox Code Playgroud)

更新:

field_name = 'someones_name'
obj = Foo.objects.get(pk=1)
getattr(obj, field_name)
Run Code Online (Sandbox Code Playgroud)

等于:

Foo.objects.get(pk=1).someones_name
Run Code Online (Sandbox Code Playgroud)

  • @init3:仅供参考,它们被称为“属性”(因此称为“getattr”),而不是“查询字段”。当您已经获得一个对象,它是一个类的实例时,该实例具有属性。从技术上讲,即使方法仍然被认为是属性,并且可以使用 `getattr` 以相同的方式查找。 (2认同)