Написание собственного менеджера для моего модельного класса с существующим экземпляром obj - PullRequest
0 голосов
/ 03 ноября 2018

Я читаю, как написать собственный менеджер для моей модели, но, похоже, у меня есть несколько вопросов. Причина, по которой я хотел бы добавить собственный менеджер в свой класс, заключается в том, что я хотел бы ввести метод с именем «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 голосов
/ 03 ноября 2018

Вы можете переопределить 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)
...