如何在Django中引用一组模型字段?

时间:2015-08-03 19:30:10

标签: python django django-models django-forms

假设我有以下Django模型:

class Person(models.Model):
    name = models.CharField()
    age = models.IntegerField()
    country = models.ForeignKey(Country)
    company = models.ForeignKey(Company)

我的应用可以根据某些条件搜索人员,然后返回包含结果的表格,仅显示用户请求的特定列。

现在我想在数据库中存储搜索以及显示的列。

class SavedSearch(models.Model):
    title = models.CharField()
    q_object = models.BinaryField()
    display_fields = ???

存储Person模型中哪些字段的最佳方式是什么?

目前我只是在TextField中存储字段名称的JSON列表(例如['name','age']),但我想知道是否有更好的方法来存储对模型字段的引用。

我还希望能够存储相关(通过ForeignKey)模型的字段。所以像['name','age','company__website']

1 个答案:

答案 0 :(得分:1)

我担心你不能以这种方式保存对模型字段的引用,但你可以使用一个计算属性来保存模型名称并根据需要返回字段引用 -

  • 将模型名称与字段一起保存。

    class SavedSearch(models.Model):
        title = models.CharField()
        q_object = models.BinaryField()
        model_name = models.CharField() # 'app_label.Person'
        display_fields = models.CharField() # 'name,age,company__website' -> comma separated vaulues
    
  • 然后添加计算属性 -

        @property
        def display_fields_property(self):    
            from django.apps import apps
            properties = [] 
            # get the model class using apps from django.apps
            model = apps.get_model(app_label=self.model_name.split('.')[0], model_name=self.model_name.split('.')[1]) 
            for x in self.display_fields.split(','):
                # get the property from the model class
                properties.append(getattr(model, x)
            # properties contains field reference of the model fields
            return properties