-
Notifications
You must be signed in to change notification settings - Fork 0
/
fields.py
29 lines (25 loc) · 1.2 KB
/
fields.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# -*- coding:utf-8 -*-
from django.db.models import ForeignKey
from django.db.models.fields.related import SingleRelatedObjectDescriptor
class AutoSingleRelatedObjectDescriptor(SingleRelatedObjectDescriptor):
def __get__(self, instance, instance_type=None):
cached_name = '_cached_' + self.related.get_accessor_name()
if not hasattr(instance, cached_name):
try:
obj = super(AutoSingleRelatedObjectDescriptor, self).__get__(instance, instance_type)
except self.related.model.DoesNotExist:
obj = self.related.model(**{self.related.field.name: instance})
obj.save()
setattr(instance, cached_name, obj)
return getattr(instance, cached_name)
class AutoForeignKey(ForeignKey):
'''
OneToOneField, которое создает зависимый объект при первом обращении
из родительского, если он еще не создан.
'''
def contribute_to_related_class(self, cls, related):
setattr(cls, related.get_accessor_name(), AutoSingleRelatedObjectDescriptor(related))
#if not cls._meta.one_to_one_field:
# cls._meta.one_to_one_field = self
def get_internal_type(self):
return 'ForeignKey'