【问题标题】:Django Custom Manager add attributeDjango 自定义管理器添加属性
【发布时间】:2012-06-22 01:06:09
【问题描述】:

我有一个看起来像这样的 Django 模型:

class MyModel(models.Model):
    field1 = models.IntegerField()
    field2 = models.IntegerField()
    nonDbField = SomeObject()
    objects = MyCustomManager()

field1 实际上是 SomeObject 抽象类的 PK。

我想要一个自定义管理器,它对任何函数(all、filter、get 等)返回的每个值执行以下操作:

 value.nonDbField = SomeObject.objects.get(pk=value.field1)

我已经测试过我可以像这样手动覆盖 get:

class MyCustomManager(models.Manager):
    def get(self, *args, **kwargs):
        value = super(MyCustomManager, self).get(*args, **kwargs)
        value.nonDbField = SomeObject.objects.get(listid=value.itemListID)
        return value

但想知道是否有更简单的方法可以在所有功能中执行此操作。

会有很多人会说,“你为什么要这样做?”。它与遗留但仍处于活动状态的数据库的模型继承有关。

【问题讨论】:

    标签: django django-custom-manager


    【解决方案1】:

    如果您需要将 nonDbField 的值与 field1(或模型中的任何其他字段)相关联,您可以尝试以下操作:

    Class MyModel(models.Model):
    
        # your fields here...
    
        def _nonDbField(self):
            return SomeObject.objects.get(pk=self.field1)
        nonDbField = property(_nonDbField)
    

    这允许你做这样的事情:

    MyModel.objects.get(pk=1).nonDbField
    

    请记住,您每次访问 nonDbField 时都会进行数据库查询(这可能会也可能不会损害您的数据库性能)。

    【讨论】:

      【解决方案2】:

      您可以在计算字段中使用property

      类 MyModel(models.Model):

      # your fields here...
      first_name = models.CharField()
      last_name = models.CharField()
      
      @property
      def fullname(self):
          return f"{self.first_name} {self.last_name}"
      

      这允许你做这样的事情:

      obj = MyModel.objects.get(pk=1)
      print(obj.fullname)
      

      【讨论】:

        猜你喜欢
        • 2018-07-15
        • 2013-01-26
        • 2015-01-06
        • 1970-01-01
        • 1970-01-01
        • 2015-12-10
        • 1970-01-01
        • 2012-07-10
        • 1970-01-01
        相关资源
        最近更新 更多