Unverified Kaydet (Commit) 971170c2 authored tarafından Eray Erdin's avatar Eray Erdin 🎖 Kaydeden (comit) GitHub

Merge pull request #6 from erayerdin/feat/overriding-manager-methods

Overriding Manager and QuerySet Methods
......@@ -80,6 +80,8 @@ class FooView(TemplateView):
This was only an example. You can already use custom template tags to get
`Variable`s in templates, discussed in the next section.
[^1]: See [installation](/#installation) section.
### Retrieving in Template
In order to get a variable in a template, you need to first load
......@@ -95,4 +97,20 @@ You can use `get_var` tag to get a `Variable`'s value:
{% get_var "FOO" %}
```
[^1]: See [installation](/#installation) section.
## Updating A Variable
You can update a single variable:
```python
variable.value = 5
variable.save()
# or
variable.save(update_fields=("value",))
```
Or you can mass update on a `QuerySet`:
```python
variables = Variable.objects.filter(name__startswith="FOO")
variables.update(value=5)
```
......@@ -6,6 +6,31 @@ from django.db import models
_LOGGER = logging.getLogger(__name__)
def _change_value_kwarg(kwargs):
"""
Changes `value` to `value_binary` by serializing it.
"""
_LOGGER.debug("Removing `value_binary`...")
kwargs.pop("value_binary", None)
_LOGGER.debug("Serializing `value` to `value_binary`...")
value = kwargs.pop("value", None)
value_binary = pickle.dumps(value)
kwargs["value_binary"] = value_binary
return kwargs
class _VariableQuerySet(models.QuerySet):
"""
A special queryset for `Variable` model overriding default Django queryset.
"""
def update(self, **kwargs):
_change_value_kwarg(kwargs)
return super().update(**kwargs)
class _VariableManager(models.Manager):
"""
A special manager for `Variable` model overriding default Django manager.
......@@ -17,23 +42,13 @@ class _VariableManager(models.Manager):
"""
return self.get(name=key).value
def create(self, **kwargs):
"""
Creates a `Variable` instance.
def get_queryset(self):
_LOGGER.debug("Initializing `_VariableQuerySet`...")
return _VariableQuerySet(self.model, using=self._db)
Serializes `value` to `value_binary` field using `pickle`.
If no `value` is given, `None` is serialized.
"""
_LOGGER.debug("Deleting `value_binary` kwarg...")
kwargs.pop("value_binary", None)
_LOGGER.debug("Serializing `value`...")
value = kwargs.pop("value", None)
value_binary = pickle.dumps(value)
return super().create(value_binary=value_binary, **kwargs)
def create(self, **kwargs):
_change_value_kwarg(kwargs)
return super().create(**kwargs)
class Variable(models.Model):
......
......@@ -115,5 +115,18 @@ STATIC_URL = "/static/"
#################
LOGGING = {
"version": 1,
"disable_existing_loggers": False,
"handlers": {"stream": {"level": "DEBUG", "class": "logging.StreamHandler",},},
"loggers": {
"persistent_settings": {
"handlers": ["stream"],
"level": "DEBUG",
"propagate": True,
},
},
}
INSTALLED_APPS.append("persistent_settings")
MIDDLEWARE.append("persistent_settings.middlewares.PersistentSettingsMiddleware")
import pytest
from persistent_settings import models
@pytest.mark.describe("Overriding `_VariableManager`'s Default Methods")
class TestOverrideVariableManager:
@pytest.mark.it("`create` method")
def test_create(self, db):
v = models.Variable.objects.create(name="FOO", value=5)
assert v.value == 5
@pytest.mark.it("`update` method")
def test_update(self, variable_factory):
for i in range(2):
variable_factory("bar", "FOO{}".format(i))
variables = models.Variable.objects.filter(name__startswith="FOO")
variables.update(value="baz")
for v in variables:
assert v.value == "baz"
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment