【发布时间】:2018-07-01 09:11:22
【问题描述】:
想象一下我有两个简单的模型(这不是我真正拥有的,但这会做):
Class Person(models.Model):
person_id = models.TextField()
name = models.TextField()
#...some other fields
Class Pet(models.Model):
person_id = models.TextField()
pet_name = models.TextField()
species = models.TextField()
#...even more fields
这是这个例子和我读到的其他一些问题的主要区别:我的模型不强制使用外键,所以我不能使用select_related()
我需要创建一个视图来显示两个查询集之间的连接。所以,假设我想要一个视图,所有名为 John 的所有者都带着一条狗。
# a first filter
person_query = Person.objects.filter(name__startswith="John")
# a second filter
pet_query = Pet.objects.filter(species="Dog")
# the sum of the two
magic_join_that_i_cant_find_and_possibly_doesnt_exist = join(person_query.person_id, pet_query.person_id)
现在,我可以用任何函数加入这两个非常简单的查询集吗?
或者我应该使用原始的?
SELECT p.person_id, p.name, a.pet_name, a.species
FROM person p
LEFT JOIN pet a ON
p.person_id = a.person_id AND
a.species = 'Dog' AND
p.name LIKE 'John%'
这个查询可以吗?该死的,我不确定了......这是我的查询问题。一切都是一次。但是连续的查询看起来那么简单……
如果我在模型类中引用“外键”(供select_related() 使用),迁移后是否会在数据库中强制执行? (我需要它不会发生)
【问题讨论】:
-
你应该解释为什么你不使用外键,并改变你的模型以便你这样做。对所有字段使用 TextFields(即 blob)是低效且不必要的。
-
嗯,这是问题的一个特征,它是黑匣子。数据库已经是这样了,我不应该弄乱设计(尽管我可以)。无论哪种方式,数据库都具有 OLAP 特性,因此触发器和约束都不是最佳的。文本字段是遗留数据库集成功能的映射方式。
-
好吧,你不必相信 inspectdb 的输出——它甚至说你需要编辑它。如果一个字段是另一个模型中 ID 的表示,它就是一个外键。
-
person_id是否包含整数值?然后尝试在 Django 中创建一个外键,尽管有TextField。也许它只是工作...... -
但是,Daniel,我再问一下最后是什么:如果我在models.py中写这个和这个其他字段是外来的,当我迁移时,这个约束是否会写入数据库?
标签: sql django django-models