cool.model.descriptors 源代码

# encoding: utf-8

from django.db.models.fields.related_descriptors import (
    ForwardManyToOneDescriptor, ForwardOneToOneDescriptor,
)

from cool.model import models


class ForwardCacheDescriptorMixin:
    """
    外键数据使用缓存
    """

    def get_cache_object(self, instance):
        remote_model = self.field.remote_field.model
        if not issubclass(remote_model, models.ModelCacheMixin) or not remote_model._MODEL_WITH_CACHE:
            return None
        if len(self.field.foreign_related_fields) != 1:
            return None

        val = self.field.get_local_related_value(instance)
        if len(val) != 1:
            return None
        base_filter = {
            rh_field.attname: getattr(instance, lh_field.attname)
            for lh_field, rh_field in self.field.related_fields
        }
        return remote_model.get_obj_by_unique_key_from_cache(**base_filter)

    def get_object(self, instance):
        try:
            ret = self.get_cache_object(instance)
        except Exception:
            ret = None
        if ret is not None:
            return ret
        return super().get_object(instance)


[文档]class ForwardManyToOneCacheDescriptor(ForwardCacheDescriptorMixin, ForwardManyToOneDescriptor): """ 多对一外键使用缓存 """
[文档]class ForwardOneToOneCacheDescriptor(ForwardCacheDescriptorMixin, ForwardOneToOneDescriptor): """ 一对一外键使用缓存 """