使用现有的obj实例为我的模型类编写自定义管理器

时间:2018-11-02 22:22:01

标签: python django django-models

我正在阅读如何为模型编写自定义管理器,但是似乎我有几个问题。我想在类中添加自定义管理器的原因是,我想引入一个称为“ customUpdate”的方法,该方法将基本上检查dict中的成员是否是该类的成员。到目前为止,这就是我的代码。然后,我会在一些我遇到的问题中贴出

class modelEmployer(models.Model):
    user                = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
    location            = models.PointField(srid=4326,max_length=40, blank=True, null=True)  
    objects             = GeoManager()  # models.GeoManager()

现在这是我的经理班级想要的一个粗略草图:

class customEmployerManager(models.Manager):

    def customUpdate(dataDict):
        # Check if the fields in this data are present in this model
        for key in dataDict:
            empInst = How do I get instance of class which filter returned ?
            if not hasattr(empInst, key):
                # This property is not present
                dataDict.pop(key)
                empInst.update(**dataDict) #Will this work ? Update only works with queryset 

现在这是我的问题 1-从我阅读的教程中,我需要将customEmployerManager作为objects = customEmployerManager()这样的对象成员添加到我的主模型类中,但是我目前正在使用geodjango,在那里我已经有了一些东西如何添加另一个customEmployerManager在那儿?

2-我希望在执行此类操作时调用我的更新方法

modelEmployer.objects.filter(....).customUpdate(xx)

在customUpdate中,如何访问查询集,以便可以在其上调用.update(**dataDict)?我目前正在做empInst.update(**dataDict),这行不通吗?另外,如何获取正在调用更新的modelEmployer实例的实例?

1 个答案:

答案 0 :(得分:0)

您可以像这样覆盖GeoManager

class customEmployerManager(GeoManager):

  def customUpdate(self, **dataDict):
    # Check if the fields in this data are present in this model
    empInst = self.get_queryset()
    for i in empInst:
        i.update(**dataDict)

# in models.py
class modelEmployer(models.Model):
    objects = customEmployerManager()
    ...
    def update(self, **kwargs):
        for key, value in kwargs.items():
           if hasattr(self, key):
              setattr(self, key, value) 
        self.save()

您需要像这样致电经理:

 modelEmployer.objects.customUpdate(**dict)