Как и почему я не могу переопределить связанный метод менеджера на django? - PullRequest
0 голосов
/ 25 августа 2018

У меня есть этот менеджер:

class ConfigValueManager(models.Manager):

    def get(self, key):
        config_value = self.filter(key=key).first()
        if config_value:
            type_caster = locate(config_value.type)
            return type_caster(config_value.value)
        return config_value

    def set(self, key, value):
        self.filter(key=key).update(value=value)

    def set2(self, key, value):
        qs = self.filter(key=key)
        if qs:
            qs.update(value=value, type=type(value).__name__, company=self.instance)
        else:
            self.create(key=key, value=value, type=type(value).__name__, company=self.instance)

проблема в том, что я не могу перезаписать set.Метод все еще исходит от родителя, хотя я создал set для ребенка.Забавно, что get и set2 в порядке.Даже add, которого нет в моем примере, нельзя переопределить.

Мой вопрос: как мне перезаписать set и почему это происходит?

1 Ответ

0 голосов
/ 25 августа 2018

models.py

from django.db import models
from django.db.models.query import QuerySet


class PersonQuerySet(QuerySet):
    def set(self, slug, **kwargs):
        return self.filter(slug=slug).update(**kwargs)


class Person(models.Model):
    name = models.CharField(max_length=100, null=True)
    slug = models.CharField(max_length=10, null=True)

    objects = PersonQuerySet.as_manager()

tests.py

from django.test import TestCase
from core.models import Person

class TestSet(TestCase):
    def test_just_update_records_with_the_same_slug(self):
        Person.objects.create(slug='batman', name='John')
        Person.objects.create(slug='batman', name='Connor')
        Person.objects.create(slug='bruce', name='Ill be back')

        Person.objects.set('batman', name='###')

        expected_value = 2
        result = Person.objects.filter(name='###').count()

        self.assertEqual(result, expected_value)

пример github

https://github.com/luivilella/django-test-manager

...