在模型save()中如何获取所有以'foo'开头的字段

1 投票
3 回答
505 浏览
提问于 2025-04-15 19:36

我有一个这样的 Django 模型:

from django.db import models

class MyModel(models.Model):
    foo_it = model.CharField(max_length=100)
    foo_en = model.CharField(max_length=100)

    def save(self):
        print_all_field_starting_with('foo_')
        super(MyModel, self).save()

我想获取所有以 foo 开头的字段(举个例子),然后对这些字段做点什么。

我在代码里无法做到这一点,因为我不知道模型里的所有字段(我在使用 django-transmeta)。

那么,我该怎么做呢?

提前谢谢你;)

3 个回答

2

你可以这样做:

for field in dir(self):
    if field.startswith('foo_'):
      # getting with getattr(self, field)
      # setting with setattr(self, field, value)

如果你想获取字段的列表,你也可以这样做:

foo_fields = [field for field in dir(self) if field.startswith('foo_')]

或者打印出foo字段的值列表:

print map(lambda x: getattr(self, x), [field for field in dir(self) if field.startswith('foo_')])
2

这样做就可以了,不过你还需要传入你想打印的对象的字段:

import inspect
def print_all_field_starting_with(prefix, object):
    for name, value in inspect.getmembers(object):
        if name.startswith(prefix):
            print name # or do something else

想了解更多信息,可以查看inspect模块的文档

2

有一个叫 get_all_field_names() 的方法,它是所有模型的 Meta 子类里自带的,可以通过 foo._meta.get_all_field_names() 来找到:

>>> from foo.models import Foo
>>> f = Foo.objects.get(pk=1)
>>> f._meta.get_all_field_names()
['active', 'created', 'expires', 'id', , 'inputter', 'reason', 'requester', 'updated']

所以这其实是个很简单的事情:

def print_all_fields_starting_with(obj, starter):
    fields = [x for x in obj._meta.get_all_field_names() if x.startswith(starter)]
    for field in fields:
        print getattr(obj, field)

在你自定义的 save() 方法里:

def save(self):
    print_all_fields_starting_with(self, "foo_")
    super(MyModel, self).save()

撰写回答