ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python – 自定义Django模型字段的字段查找功能

2019-08-27 01:57:16  阅读:133  来源: 互联网

标签:python django django-models django-queryset


我有一个自定义模型字段YearWithSurenessField,它由python中的自定义数据类型YearWithSureness表示. YearWithSureness的构造函数是YearWithSureness(year =”,is_certain = False),其中year是”或者是四位数年份(作为字符串),is_certain是一个bool,表示我是否确定给定年份是正确的.此类型的模型字段以年份/ is_certain的形式存储在我的数据库中,例如“2008 / True”,“2011 / False”,“/ False”等

例如,在会员模型中,我有一个字段grad_year = YearWithSurenessField(…),它存储会员的毕业年份以及我是否确定我存储的年份是正确的.

我希望能够做的就是使用类似的东西

Member.objects.filter(grad_year__year=2011)

获取其grad_year为“2011 / True”或“2011 / False”的所有成员的QuerySet.同样,我希望能够使用类似的东西

Member.objects.filter(grad_year__range=(2000, 2011))

获取其grad_year在2000至2011范围内的所有成员的QuerySet,而不管grad_year.is_certain是True还是False.

这可能吗?我知道我可以使用Member.objects.filter(grad_year__contains =“2011”)来获得第一个结果,但我希望能够使用__year.

这是相关的类,修剪了无关的代码:

class YearWithSureness(object):
    def __init__(self, year='', is_certain=False):
        # ...

    def __str__(self):
        return "{year}/{is_certain}".format(year=self.year,
                                            is_certain=self.is_certain)

class YearWithSurenessField(models.Field):
    __metaclass__ = models.SubfieldBase

    def __init__(self, *args, **kwargs):
        # ...

    def to_python(self, value):
        # ...

    def get_prep_value(self, value):
        # ...

    def get_prep_lookup(self, lookup_type, value):
        if lookup_type in ('month', 'day'):
            raise TypeError('Lookup type {0} not supported.'.format(lookup_type))
        else:
            return super(YearWithSurenessField, self).get_prep_lookup(lookup_type, value)

    def value_to_string(self, obj):
        # ...

解决方法:

这是我觉得有用的东西:
Creating custom Field Lookups in Django

更灵活的方法是编写自定义QuerySet以及自定义管理器.使用ozan的代码:

class PersonQuerySet(models.query.QuerySet):
    def in_age_range(self, min, max):
        return self.filter(age__gte=min, age__lt=max)

class PersonManager(models.Manager):
    def get_query_set(self):
         return PersonQuerySet(self.model)

    def __getattr__(self, name):
        return getattr(self.get_query_set(), name)

class Person(models.Model):
    age = #...
    objects = PersonManager()

这允许您链接自定义查询.所以这两个查询都是有效的:

Person.objects.in_age_range(20,30)
Person.objects.exclude(somefield = some_value).in_age_range(20, 30)

标签:python,django,django-models,django-queryset
来源: https://codeday.me/bug/20190827/1735792.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有