标签: django-orm

Django数据库查询:如何通过id获取对象?

Django自动创建一个id字段作为主键.

现在我需要通过此id获取对象.

object = Class.objects.filter() 
Run Code Online (Sandbox Code Playgroud)

怎么写这个过滤器?

django django-models django-orm

85
推荐指数
3
解决办法
10万
查看次数

在Django中链接多个filter(),这是一个错误吗?

我一直认为在Django中链接多个filter()调用始终与在一次调用中收集它们相同.

# Equivalent
Model.objects.filter(foo=1).filter(bar=2)
Model.objects.filter(foo=1,bar=2)
Run Code Online (Sandbox Code Playgroud)

但我在我的代码中遇到了一个复杂的查询集,而事实并非如此

class Inventory(models.Model):
    book = models.ForeignKey(Book)

class Profile(models.Model):
    user = models.OneToOneField(auth.models.User)
    vacation = models.BooleanField()
    country = models.CharField(max_length=30)

# Not Equivalent!
Book.objects.filter(inventory__user__profile__vacation=False).filter(inventory__user__profile__country='BR')
Book.objects.filter(inventory__user__profile__vacation=False, inventory__user__profile__country='BR')
Run Code Online (Sandbox Code Playgroud)

生成的SQL是

SELECT "library_book"."id", "library_book"."asin", "library_book"."added", "library_book"."updated" FROM "library_book" INNER JOIN "library_inventory" ON ("library_book"."id" = "library_inventory"."book_id") INNER JOIN "auth_user" ON ("library_inventory"."user_id" = "auth_user"."id") INNER JOIN "library_profile" ON ("auth_user"."id" = "library_profile"."user_id") INNER JOIN "library_inventory" T5 ON ("library_book"."id" = T5."book_id") INNER JOIN "auth_user" T6 ON (T5."user_id" = T6."id") INNER JOIN "library_profile" T7 ON (T6."id" = …
Run Code Online (Sandbox Code Playgroud)

django django-orm

83
推荐指数
4
解决办法
7万
查看次数

在django中选择DISTINCT个别列?

我很好奇是否有任何方法可以在Django中进行查询而不是SELECT * FROM..."下面的".我正在尝试做一个" SELECT DISTINCT columnName FROM ...".

具体来说,我有一个模型,看起来像:

class ProductOrder(models.Model):
   Product  = models.CharField(max_length=20, promary_key=True)
   Category = models.CharField(max_length=30)
   Rank = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)

其中Rank是一个排名Category.我希望能够遍历所有类别,对该类别中的每个等级进行一些操作.

我想首先获得系统中所有类别的列表,然后查询该类别中的所有产品并重复,直到处理完每个类别.

我宁愿避免使用原始SQL,但如果我必须去那里,那就没事了.虽然我以前从来没有在Django/Python中编写原始SQL.

django distinct django-models django-orm django-queryset

80
推荐指数
4
解决办法
11万
查看次数

如何解决Django中跨数据库的外键缺乏支持

我知道Django不支持跨多个数据库的外键(最初是Django 1.3 docs)

但我正在寻找一种解决方法.

什么行不通

我在一个单独的数据库上有两个模型.

routers.py:

class NewsRouter(object):
    def db_for_read(self, model, **hints):
        if model._meta.app_label == 'news_app':
            return 'news_db'
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label == 'news_app':
            return 'news_db'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        if obj1._meta.app_label == 'news_app' or obj2._meta.app_label == 'news_app':
            return True
        return None

    def allow_syncdb(self, db, model):
        if db == 'news_db':
            return model._meta.app_label == 'news_app'
        elif model._meta.app_label == 'news_app':
            return False
        return None
Run Code Online (Sandbox Code Playgroud)

fruit_app/models.py中的模型1:

from django.db import models

class Fruit(models.Model):
    name …
Run Code Online (Sandbox Code Playgroud)

django django-models django-orm

76
推荐指数
1
解决办法
6794
查看次数

Django使用contains过滤多对多

我试图通过多对多关系过滤一堆对象.因为trigger_roles字段可能包含多个条目,所以我尝试了包含过滤器.但是因为它被设计为与字符串一起使用,我几乎无能为力地过滤这种关系(你可以忽略values_list()atm.).

此功能附加到用户配置文件:

def getVisiblePackages(self):
    visiblePackages = {}   
    for product in self.products.all():
        moduleDict = {}
        for module in product.module_set.all():
            pkgList = []
            involvedStatus = module.workflow_set.filter(trigger_roles__contains=self.role.id,allowed=True).values_list('current_state', flat=True)
Run Code Online (Sandbox Code Playgroud)

我的工作流模型看起来像这样(简化):

class Workflow(models.Model):
    module = models.ForeignKey(Module)
    current_state = models.ForeignKey(Status)
    next_state = models.ForeignKey(Status)
    allowed = models.BooleanField(default=False)
    involved_roles = models.ManyToManyField(Role, blank=True, null=True)
    trigger_roles = models.ManyToManyField(Role, blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)

虽然解决方案可能很简单,但我的大脑不会告诉我.

谢谢你的帮助.

python django many-to-many django-models django-orm

68
推荐指数
4
解决办法
7万
查看次数

SQLAlchemy可以做什么,Django ORM不能做的例子

我最近在使用Pyramid和SQLAlchemy进行了大量的研究,而不是在Django中保留当前的应用程序.这本身就是一场辩论,但我不是在讨论这个问题.

我想知道的是,为什么SQLAlchemy普遍被认为比Django ORM更好?几乎每一个(如果不是每一个)我在SQLAlchemy这两个好处之间找到的比较.我认为性能是一个很大的性能,因为SQLAlchemy的结构可以让它更顺利地转换为SQL.

但是,我也听说过,使用更难的任务,Django ORM几乎不可能使用.我想说明这可能是一个多大的问题.我一直在阅读切换到SQLAlchemy的原因之一是当Django ORM不再适合您的需求时.

因此,简而言之,有人可以提供SQLAlchemy可以执行的查询(不一定是实际的SQL语法),但Django ORM不可能在没有添加额外的原始SQL的情况下做到吗?

更新:

自从我第一次问到这个问题以来,我一直注意到这个问题得到了很多关注,所以我想多花两美分.

最后我们最终使用了SQLAlchemy,我必须说我对这个决定感到满意.

我正在重新审视这个问题以提供SQLAlchemy的一个额外功能,到目前为止,我还没有能够在Django ORM中复制.如果有人可以提供一个如何做到这一点的例子,我会很乐意吃掉我的话.

假设您想使用一些postgresql函数,例如similarity(),它提供模糊比较(请参阅:快速查找与PostgreSQL类似的字符串 - tl; dr输入两个字符串获得百分比相似性).

我已经用Django ORM做了一些关于如何做到这一点的搜索,除了使用原始的sql之外什么也没发现,因为他们的文档中似乎很明显:https://docs.djangoproject.com/en/dev/topics/db/sql /.

Model.objects.raw('SELECT * FROM app_model ORDER BY \
similarity(name, %s) DESC;', [input_name])
Run Code Online (Sandbox Code Playgroud)

但是,SQLalchemy有func(),如下所述:http://docs.sqlalchemy.org/en/latest/core/sqlelement.html#sqlalchemy.sql.expression.func

from sqlalchemy import desc, func
session.query(Model).order_by(func.similarity(Model.name, input_name))
Run Code Online (Sandbox Code Playgroud)

这允许您为任何已定义的sql/postgresql/etc函数生成sql,而不需要原始sql.

python sqlalchemy django-orm

65
推荐指数
2
解决办法
1万
查看次数

Django,从模型方法查询过滤

我有这些模型:

def Foo(Models.model):
    size = models.IntegerField()
    # other fields

    def is_active(self):
         if check_condition:
              return True
         else:
              return False

def Bar(Models.model):
     foo = models.ForeignKey("Foo")
     # other fields
Run Code Online (Sandbox Code Playgroud)

现在我想要查询具有活动Foo的条形码:

Bar.objects.filter(foo.is_active())
Run Code Online (Sandbox Code Playgroud)

我收到的错误如

SyntaxError at /
('non-keyword arg after keyword arg'
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

python django django-models django-orm django-queryset

63
推荐指数
4
解决办法
4万
查看次数

Django:模型中的列表字段?

在我的模型中,我想要一个包含三元组列表的字段.例如`[[1,3,4],[4,2,6],[8,12,3],[3,3,9]].是否有可以将此数据存储在数据库中的字段?

django django-orm

62
推荐指数
6
解决办法
9万
查看次数

在Django QuerySet中,如何在多对一关系中过滤"不存在"

我有两个这样的模型:

class User(models.Model):
    email = models.EmailField()

class Report(models.Model):
    user = models.ForeignKey(User)
Run Code Online (Sandbox Code Playgroud)

实际上,每个模型都有更多的字段,这些字段与此问题无关.

我想过滤所有拥有以"a"开头并且没有报告的电子邮件的用户.将有更多.filter().exclude()基于其他领域的标准.

我想这样做:

users = User.objects.filter(email__like = 'a%')

users = users.filter(<other filters>)

users = ???
Run Code Online (Sandbox Code Playgroud)

我想要 ???过滤掉没有与之关联的报告的用户.我该怎么做?如果这不可能像我提出的那样,那么另一种方法是什么?

django django-models django-orm

52
推荐指数
4
解决办法
3万
查看次数

Django:有没有办法从单元测试中计算SQL查询?

我试图找出实用程序函数执行的查询数.我已经为这个函数编写了一个单元测试,并且该函数运行良好.我想要做的是跟踪函数执行的SQL查询的数量,以便我可以看到在重构之后是否有任何改进.

def do_something_in_the_database():
    # Does something in the database
    # return result

class DoSomethingTests(django.test.TestCase):
    def test_function_returns_correct_values(self):
        self.assertEqual(n, <number of SQL queries executed>)
Run Code Online (Sandbox Code Playgroud)

编辑:我发现有一个待定的Django 功能请求.但是票仍然是开放的.与此同时还有另一种方法可以解决这个问题吗?

django django-orm django-testing

49
推荐指数
6
解决办法
2万
查看次数