我有两个数据库表,它们通过CharField
逻辑相关。例如,询问电话号码的调查回复,以及具有电话号码的人:
class SurveyResponse(Model):
phone_number = CharField()
favorite_brand_of_soda = CharField()
person = JoinedOneToOneField("Person", from_field="phone_number", to_field="phone_number")
class Person(Model):
phone_number = CharField()
name = CharField()
是否可以创建一个字段 - 就像本例中的JoinedOneToOneField
一样 - 这样我就可以查询与Person
相关的SurveyResponse
(如果存在)?
例如,我可以使用select_related
来确保查询有效:
>>> responses = SurveyResponse.objects.all().select_related("person")
>>> print [ (r.person.name, r.favorite_brand_of_soda) for r in responses ]
这样我就可以通过属性查找访问相关的Person
:
>>> response = SurveyResponse.objects.get(…)
>>> print response.person.name
我知道ForeignKey
接受to_field=
参数,但这不会完全做到,因为数据库会尝试通过该字段强制实施参照完整性,这与数据模型不一致。 / p>
换句话说,类似于SQLAlchemy的relationships。
请注意:我不想使用FOREIGN KEY
:我正在处理的记录是铅笔纸形式,以及无保证数字将匹配。在你提出我的错误之前,请考虑这是一个简化示例,而且我真的,老实说,确实知道如何使用ForeignKey
字段。< / p>
答案 0 :(得分:2)
OK!因此,经过一些激烈的挖掘,它似乎似乎这样可能......至少以任何一般的方式。具体来说,查看fill_related_selections
(尽我所知,负责解析select_related
),它似乎use Options.get_fields_with_object()
......但仅Options.get_fields_with_object
包括“本地”字段(即映射到列的字段):https://github.com/django/django/blob/4dbd95ad/django/db/models/options.py#L328
这似乎可以创建任何类型的JoinedForeignKey
字段,可用于select_related(…)
,这是不可能的:这样的字段需要是“虚拟的”(因为它没有数据库列) ,但select_related
个查询中不包含虚拟字段:(
现在!有可能创建一个特殊的案例字段,可以加入恰好一个其他表...类似于:
class SurveyResponse(Model):
phone_number = UglyJoinedForeignKey(
CharField(…),
fk_field="person",
to=Person,
to_field="phone_number",
)
它需要被要加入的字段查询,而不是用于连接对象的字段的名称:
SurveyResponse.objects.all().select_related("phone_number")
但是......这似乎不值得:\