
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) 考虑这个查询:
query = Novel.objects.< ...some filtering... >.annotate(
latest_chapter_id=Max("volume__chapter__id")
)
Run Code Online (Sandbox Code Playgroud)
实际上我需要的是Novel用最新的Chapter对象来注释每个对象,所以在这个查询之后我必须执行另一个查询来通过带注释的ID来选择实际的对象.IMO这很难看.有没有办法将它们组合成一个查询?
我有一个我的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) 我有以下型号:
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 DateQuerySet我会item从Group查询中提取相关年份.
>>> 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中的多对多关系示例:
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通过引入任何额外的功能使一个方向比另一个方向更容易?
我有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 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 …
我想从分配给的所有组中删除用户.我在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 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 ×10
django-orm ×10
python ×3
annotate ×1
m2m ×1
many-to-many ×1
model ×1
orm ×1
recursion ×1
relationship ×1