代码之家  ›  专栏  ›  技术社区  ›  patrick genkilabs

在model save()中,如何获取以“foo”开头的所有字段

  •  1
  • patrick genkilabs  · 技术社区  · 15 年前

    我有一个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 回复  |  直到 15 年前
        1
  •  2
  •   jathanism    15 年前

    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
  •  2
  •   Will McCutchen    15 年前

    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

        3
  •  2
  •   Felix Kling    15 年前

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