В модели save () как получить все поля, начинающиеся с 'foo' - PullRequest
1 голос
/ 23 февраля 2010

У меня есть эта модель Джанго:

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 голосов
/ 23 февраля 2010

Это поможет, хотя вам также нужно передать объект, поля которого вы хотите напечатать:

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

См. Документацию для модуля проверки для получения дополнительной информации.

2 голосов
/ 23 февраля 2010

Существует метод 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()
2 голосов
/ 23 февраля 2010

Вы можете сделать:

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_')])
...