Я пока неопытный и учусь, поэтому не судите строго.
vacancy = Vacancy.objects.create(...)
vacancy.vac_name # Красиво, п****ц, да?
Mention.objects.filter(mentionn_id=step_id).order_by('-pk')[:3]
If no such ordering is defined for a given QuerySet, calling reverse() on it has no real effect
from django.contrib.auth.models import Permission, Group
from django.contrib.contenttypes.models import ContentType
content_type = ContentType.objects.get_for_model(YourModel)
my_permission = Permission.objects.create(codename='your_permission',
name='Can access something',
content_type=content_type)
my_group = Group.objects.create(name='My Group')
my_group.permissions = [my_permission]
user.groups.add(my_group)
user.has_perm('app_label.your_permission') # True
def is_paid(self):
if self.paid_till is None:
return False
return self.paid_till >= timezone.now()
from django.db import models
from django.contrib.auth.models import AbstractUser
# Это лучше перенести в отдельный файл consts.py
USER_ADMIN = 'adm'
USER_MANAGER = 'mng'
USER_VASYA = 'vas'
USER_TYPES = (
(USER_ADMIN, 'Администратор'),
(USER_MANAGER, 'Менеджер'),
(USER_VASYA, 'Вася'),
)
class User(AbstractUser):
type = models.CharField(max_length=3, choices=USER_TYPES)
class Meta(AbstractUser.Meta):
swappable = 'AUTH_USER_MODEL'
from django.core.exceptions import PermissionDenied
# тут импорт USER_VASYA
class VasyaRequiredMixin(object):
def dispatch(self, request, *args, **kwargs):
if request.user.type != USER_VASYA:
raise PermissionDenied
return super(VasyaRequiredMixin, self).dispatch(request, *args, **kwargs)
class VasyaView(VasyaRequiredMixin, View):
def get(self, request, *args, **kwargs):
return HttpResponse('Vasya molodec')
import pymysql
pymysql.install_as_MySQLdb()
from datetime import timedelta
from django.db import models
from django.utils import timezone
class Settings(models.Model):
"""
Модель настроек с интерфейсом атрибутов
>>> settings.hello = 'world'
Сохранит модель с key='hello' и value='world'. Если модель с таким ключом до этого
существовала (т.е. в данный момент мы меняем значение), запись в БД поменяется и кэш
инвалидируется.
>>> settings.hello
'world'
Получение ключа. Сначала ищет в кэше. Если находит - возвращает, если нет,
ищет в БД запись с таким ключом (hello). Если находит - кладёт в кэш и возвращает.
>>> del settings.hello
Удаляет запись с ключом hello из БД и кэша.
Также, ключ и значение можно редактировать из админки (кэш в этом случает также
инвалидируется)
Пример куска вьюхи, которая может редактировать настройки сайта:
if form.is_valid():
settings.phone = form.cleaned_data['phone']
settings.address = form.cleaned_data['address']
"""
key = models.CharField(max_length=255, primary_key=True)
value = models.TextField()
__cache_ttl = 60 * 60
__cache = {}
__cache_max_size = 300
def save(self, *args, **kwargs):
super(Settings, self).save(*args, **kwargs)
self._cache_invalidate(self.key)
def __setattr__(self, key, value):
cls = type(self)
try:
instance = cls.objects.get(key=key)
instance.value = value
instance.save()
except cls.DoesNotExist:
cls.objects.create(key=key, value=value)
self._cache_invalidate(key)
def __getattr__(self, key):
value = self._cache_get(key)
if value is None:
cls = type(self)
try:
value = cls.objects.get(key=key).value
self._cache_set(key, value)
except cls.DoesNotExist:
value = None
return value
def __delattr__(self, key):
type(self).objects.filter(key=key).delete()
self._cache_invalidate(key)
def _cache_set(self, key, value):
if len(self.__cache) < self.__cache_max_size:
self._cache_force_set(key, value)
else:
self._cache_remove_old()
if len(self.__cache) < self.__cache_max_size:
self._cache_force_set(key, value)
def _cache_force_set(self, key, value):
self.__cache[key] = (
value,
timezone.now() + timedelta(seconds=self.__cache_ttl)
)
def _cache_get(self, key):
result = self.__cache.get(key)
if result[1] > timezone.now():
self._cache_invalidate(key)
return None
return result[0]
def _cache_invalidate(self, key):
del self.__cache[key]
def _cache_remove_old(self):
now = timezone.now()
for k, v in self.__cache.items():
if v[1] < now:
self._cache_invalidate(k)
settings = Settings()
def settings(request):
return {'settings': settings}
<title>{{ settings.title }}</title>
db_table, для меня так удобно.
python manage.py syncdb
Django 1.8