标签: django-orm

Django ORM SELECT加入

呃

django中的型号:

class Key(models.Model):
    id     = models.AutoField(primary_key=True, blank=True)
    name   = models.CharField(max_length=50)


class Record(models.Model):
    id         = models.AutoField(primary_key=True, blank=True)
    project_id = models.IntegerField()
    name       = models.CharField(max_length=50)


class Value(models.Model):
    id        = models.AutoField(primary_key=True, blank=True)
    record    = models.ForeignKey(Record)
    key       = models.ForeignKey(Key)
    value     = models.CharField(max_length=255)
Run Code Online (Sandbox Code Playgroud)

我需要从DB中选择这个数据:

NAME (from record)
and fields related with this record
[NAME (from key), VALUE (from value)]
[NAME (from key), VALUE (from value)]
[...]
Run Code Online (Sandbox Code Playgroud)

我可以使用django ORM进行此选择吗?(例如在SQL select中看起来像这样)

SELECT
    `keeper_record`.`id` AS `record_id`,
    `keeper_record`.`name` AS `name`,
    `keeper_record`.`desc` AS `desc`,
    `keeper_key`.`name` AS `key_name`,
    `keeper_key`.`desc` AS `key_desc`,
    `keeper_value`.`value` …
Run Code Online (Sandbox Code Playgroud)

python django django-models django-orm

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

在django中,有没有办法在单个查询中直接用相关对象注释查询?

考虑这个查询:

query = Novel.objects.< ...some filtering... >.annotate(
    latest_chapter_id=Max("volume__chapter__id")
)
Run Code Online (Sandbox Code Playgroud)

实际上我需要的是Novel用最新的Chapter对象来注释每个对象,所以在这个查询之后我必须执行另一个查询来通过带注释的ID来选择实际的对象.IMO这很难看.有没有办法将它们组合成一个查询?

python django annotate django-orm

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

创建时Django模型超出了最大递归深度

我有一个我的Django模型的这个奇怪的问题,我能够解决它,但不明白发生了什么.

这些是模型:

class Player(models.Model):
    facebook_name = models.CharField(max_length=100)
    nickname = models.CharField(max_length=40, blank=True)

    def __unicode__(self):
        return self.nickname if self.nickname else self.facebook_name


class Team(models.Model):
    name = models.CharField(max_length=50, blank=True)
    players = models.ManyToManyField(Player)

    def __unicode__(self):
        name = '(' + self.name + ') ' if self.name else ''
        return name + ", ".join([unicode(player) for player in self.players.all()])
Run Code Online (Sandbox Code Playgroud)

每当我制作一个新的(空的)Team物体并想要从中获得players它时,我得到了一个RuntimeError: maximum recursion depth exceeded.例如:

>>> team = Team()
>>> team.players
    Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File …
Run Code Online (Sandbox Code Playgroud)

django recursion model django-orm

10
推荐指数
1
解决办法
2595
查看次数

如何在django中获取涉及多对多关系的对象列表

我有以下型号:

class Committee(models.Model):
    customer = models.ForeignKey(Customer, related_name="committees")
    name = models.CharField(max_length=255)
    members = models.ManyToManyField(member, through=CommitteeMember, related_name="committees")
    items = models.ManyToManyField(Item, related_name="committees", blank=True)

class CommitteeRole(models.Model):
    committee = models.ForeignKey('Committee')
    member = models.ForeignKey(member)
    #user is the members user/user number
    user = models.ForeignKey(User)
    role = models.IntegerField(choices=ROLES, default=0)

class Member(models.Model):
    customer = models.ForeignKey(Customer, related_name='members')
    name = models.CharField(max_length=255)

class Item(models.Model):
    customer = models.ForeignKey(Customer, related_name="items")
    name = models.CharField(max_length=255)

class Customer(models.Model):
    user = models.OneToOneField(User, related_name="customer")
    name = models.CharField(max_length=255)
Run Code Online (Sandbox Code Playgroud)

我需要获取所有属于用户通过其连接的所有委员会的项目CommitteeRole.

像这样的东西:

committee_relations = CommitteeRole.objects.filter(user=request.user)
item_list = Item.objects.filter(committees=committee_relations__committee)
Run Code Online (Sandbox Code Playgroud)

我怎么能做到这一点?

django django-models django-orm

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

在Django中按月/年注释(组)日期

使用Django DateQuerySet我会itemGroup查询中提取相关年份.

>>> Group.objects.all().dates('item__date', 'year')
[datetime.date(1990, 1, 1), datetime.date(1991, 1, 1), ...(remaining elements truncated)...']
Run Code Online (Sandbox Code Playgroud)

现在我想在这些日期按不同的年份进行计数.我认为这会奏效:

>>> Group.objects.all().dates('item__date', 'year').annotate(Count('year'))
FieldError: Cannot resolve keyword 'year' into field.
Run Code Online (Sandbox Code Playgroud)

但看起来我错过了一些东西.我该如何修复此查询?

我也试过这个查询:

>>> (Group
     .objects
     .all()
     .extra(select=
         {'year': 
          connections[Group.objects.db].ops.date_trunc_sql('year', 'app_item.date')}))
ProgrammingError: missing FROM-clause entry for table "app_item" LINE 1: SELECT (DATE_TRUNC('year', app_item.date)) AS...
Run Code Online (Sandbox Code Playgroud)

但这也不起作用.

django aggregate-functions django-models django-orm

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

Django 1.8 - 中间人多对多关系 - 使用'ManytoManyField'的结果是什么?

Django中的多对多关系示例:

class First(models.Model):
    seconds = models.ManyToManyField(Second, through='Middle')

class Middle(models.Model):
    first = models.ForeignKey(First)
    second = models.ForeignKey(Second)

class Second(models.Model):
Run Code Online (Sandbox Code Playgroud)

根据中间模型文档,只有一个相关对的ManytoManyField模型包含上面示例中的模型First.它是否正确?

如果是这样,哪个模型应包含该ManytoManyField字段?使用任何一方的关系是否有任何差异取决于它在哪里ManytoManyField

谢谢

编辑(我应该更清楚):

我对中介表感兴趣,因为我将有额外的数据存储在关系中.

当我说使用时,我并不是指定义模型,我的意思是使用关系(否则我会让Django做它的事情).

如果我想要所有与第一个相关的秒,它是否与获得与第二个相关的所有第一个完全相同,或者ManytoManyField通过引入任何额外的功能使一个方向比另一个方向更容易?

django many-to-many django-orm relationship m2m

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

使用ManyToManyField更新update_or_create

我有2个型号,像这样:

class Subs(models.Model):
    tag = models.CharField(max_length=100)

class Users(models.Model):
    name = models.CharField(max_length=100)
    tags = models.ManyToManyField(Subs)
Run Code Online (Sandbox Code Playgroud)

我需要更新标签字段 - 添加新值.如何使用update_or_create方法更新用户的实例?

例如:

tag_1 = Subs.object.get(pk=1)
Users.objects.update_or_create(name='test_user', tags=tag_1)
Run Code Online (Sandbox Code Playgroud)

如果用户'test_user'不存在,则必须创建它,或者如果存在,则必须将tag_1添加到此用户.

django django-models django-orm

10
推荐指数
1
解决办法
1581
查看次数

Django 的单例架构是否使其无法作为库中的独立 ORM 使用?

我喜欢 Django ORM。它简单、易于使用且功能相当强大。

我目前正在为我工​​作的 VFX 公司开发一些内部网站,为此我使用了 Django。与此同时,我们正在开发其他 Python 应用程序和库,以用于生产中的各种上下文。我们的核心库在很多地方需要与一些数据库进行交互,使用像 Django 这样的 ORM 真的会有所帮助。我知道其他选项,如 SqlAlchemy 或 PeeWee,但我想看看 Django 是否可以工作,因为我在网站上使用它并且我更喜欢它的 API。

在库中使用 Django 作为 ORM 很棘手(正如我在上一个问题中探讨的那样),因为 Django 希望被用作带有“应用程序”的网站。在库中,我可能想要定义任意数量的数据模型,这些模型将存在于库中的适当位置,但不在任何 Django 应用程序中(因为我们没有使用框架的任何其他部分)。到现在为止还挺好。

我可以在库中的任何位置为我的模型创建一个基类,如下所示:

from django.db import models
from django.apps import apps
import django.conf

django.conf_settings.configure(
    DATABASES = ...
)

apps.populate((__name__,))

class LibModel(models.Model):
    class Meta:
        abstract = True
        app_label = __name__
Run Code Online (Sandbox Code Playgroud)

然后我可以在库中的任何地方使用这个基类创建我自己的模型。由于我不依赖于数据库名称的“应用程序”,因此我需要明确说明它们。

class SpecificModel(LibModel):
    # fields go here
    class Meta(LibModel.Meta):
        db_table = "specific_model_table_name"
Run Code Online (Sandbox Code Playgroud)

这解决了我对必须模拟“应用程序”结构的担忧。基类中的name属性为 Django 提供了它需要的一切,然后 Django 不再抱怨找不到应用程序。其他模型文件可以放在任何他们想要的地方。

然而,有一个明显的用例,这一切都分崩离析。假设我的 Django …

python django orm django-models django-orm

10
推荐指数
1
解决办法
651
查看次数

Django从所有组中删除用户

我想从分配给的所有组中删除用户.我在Django中使用标准的auth应用程序.

到目前为止,我可以一次删除一个组:

user.groups.remove(group)
Run Code Online (Sandbox Code Playgroud)

但这增加了很多sql开销.我知道这是一个多对多关系,但我无法找到哪个模型代表多对多映射并从那里调用delete方法.

我想用Django ORM执行以下查询:

delete from auth_user_group where user_id = 123
Run Code Online (Sandbox Code Playgroud)

django django-orm

9
推荐指数
1
解决办法
4186
查看次数

我们可以在 Django ORM 中对 CharField 进行求和吗?

我在 Django ORM 中的模型是这样的

class Test(Modelbase):
    id = models.IntegerField(null=True, blank=True)
    amount = models.CharField(max_length=255)
Run Code Online (Sandbox Code Playgroud)

我想添加 id 列表的数量。唯一的问题是金额字段是CharField。如何为金额字段申请金额?

Test.objects.filter(id__in=[1,2,3]).aggregate(Sum('amount'))
Run Code Online (Sandbox Code Playgroud)

我正在Django=1.9.1为此使用。

django django-orm

9
推荐指数
1
解决办法
1901
查看次数