django的reverseunique字段实现

django-reverse-unique的Python项目详细描述


Build StatusCoverage Status

django的reverseunique模型字段实现

reverseunique字段可用于访问 外键的反面。本质上,reverseunique可以用来 在正常方向相反的方向上产生一个类似于电场的行为 外国佬。其思想是在遍历 反向外键。

为了能够使用reverse unique,您将需要一个 反向或者知道只有反向的一个实例可以 匹配。

示例

看到实际的用例总是很好的。我们将用时间来塑造员工 本例中的从属工资。这个用例可以建模为:

class Employee(models.Model):
    name = models.TextField()

class EmployeeSalary(models.Model):
    employee = models.ForeignKey(Employee, related_name='employee_salaries')
    salary = models.IntegerField()
    valid_from = models.DateField()
    valid_until = models.DateField(null=True)

可以保存这样的数据:“Anssi从2000年1月1日到2010年1月1日的工资为10欧元, 从2010年1月1日到无限期,工资为11欧元(模型中没有)。

不幸的是,当使用这些模型时,获取 显示给用户的员工及其工资。这样做是有可能的 循环查看雇员的所有工资,并检查哪个雇员的工资 目前有效。但是,这种方法有两个缺点:

  • It doesn’t perform well in list views
  • Most of all It is impossible to execute queries that refer the employee’s current salary. For example, getting the top 10 best paid employees or the average salary of employees is impossible to achieve in single query.

Django倒车救援独一无二!让我们将员工模型更改为:

from datetime import datetime
class Employee(models.Model):
    name = models.TextField()
    current_salary = models.ReverseUnique(
        "EmployeeSalary",
        filter=Q(valid_from__gte=datetime.now) &
               (Q(valid_until__isnull=True) | Q(valid_until__lte=datetime.now))
    )

现在我们只需发出如下查询:

Employee.objects.order_by('current_salary__salary')[0:10]

或:

Employee.objects.aggregate(avg_salary=Avg('current_salary__salary'))

那里发生了什么事?我们添加了一个reverseunique字段。这个字段是相反的 具有附加限制的employeesalary.employee外键的 关系在执行查询时必须有效。第一次 “employeesalary”参数是指employeesalary模型(我们必须使用 字符串作为employeesalary模型在employee模型之后定义)。这个 filter参数是一个q对象,它可以引用远程模型的字段。

django应用程序的另一个常见问题是如何存储模型转换。 利用django逆唯一性可以解决存储问题。这里是一个完整的 该用例的示例:

from django.db import models
from reverse_unique import ReverseUnique
from django.utils.translation import get_language, activate

class Article(models.Model):
    active_translation = ReverseUnique("ArticleTranslation",
                                       filters=Q(lang=get_language))

class ArticleTranslation(models.Model):
    article = models.ForeignKey(Article)
    lang = models.CharField(max_length=2)
    title = models.CharField(max_length=100)
    body = models.TextField()

    class Meta:
        unique_together = ('article', 'lang')

activate("fi")
objs = Article.objects.filter(
    active_translation__title__icontains="foo"
).select_related('active_translation')
# Generated query is
#    select article.*, article_translation.*
#      from article
#      join article_translation on article_translation.article_id = article.id
#                               and article_translation.lang = 'fi'
# If you activate "en" instead, the lang is changed.
# Now you can access objs[0].active_translation without generating more
# queries.

同样,您可以获取酒店房间等的当前有效预订。

安装

Reverseunique的要求是django 1.6+。你需要把 反转python路径中的唯一目录,然后像上面那样使用它 例子。测试(reverse_unique/tests.py)包含了更多的例子。 最简单的安装方法是:

pip install -e git://github.com/akaariai/django-reverse-unique.git#egg=reverse_unique

测试

您需要安装支持的django版本。去 测试项目目录并运行:

python manage.py test reverse_unique

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java为游戏添加声音。需要帮助   java在获取数据时忽略模型类中的forign键映射   java为什么Microsoft JDBC驱动程序忽略failoverPartner主机名   java可以下载mozswing文件   java等价于ObjectOutputStream,不仅保存其状态,还保存整个对象?   Java Android LiveData根据其他LiveData调用房间查询   java如何使用jackson jsonNode实现这一点并获得所需的输出   在web服务器上作为web应用程序运行java应用程序?   groovy中java类的元类属性   返回空指针的java图形对象   标头中包含用户名和密码的java SOAP客户端请求   具有堆栈实现和递归的Hanoi算法塔(Java)   java当我运行这两个类时,我的老鼠不会移动   使用图像进行java相似图像搜索   Java8并行流机制   使用单例对象作为枚举元素的java Scala枚举,是否有可能对它们进行迭代?   java Webview更改高度大小   不可序列化对象和函数的java Spark Scala编程   java my app在eclipse中运行良好,而不是在jar中