我有这个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)
所以,我该怎么做?
提前致谢;)
答案 0 :(得分: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_')])
答案 1 :(得分: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
有关详细信息,请参阅documentation for the inspect module。
答案 2 :(得分: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()