3

我有两个数据库表,它们通过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=参数,但这不会完全做到这一点,因为数据库将尝试通过该字段强制执行参照完整性,这与数据模型不一致。

换句话说,类似于 SQLAlchemy 的关系

请注意:我不想使用FOREIGN KEY: 我正在处理的记录是纸笔表格,并且不能保证数字会匹配。在你认为我错了之前,请考虑这是一个简化的例子,而且我真的,老实说,知道如何使用一个ForeignKey字段。

4

1 回答 1

2

好的!所以经过一番激烈的挖掘之后,这似乎是不可能的……至少在任何一种普遍的方式上都是这样。具体来说,看看fill_related_selections(据我所知,它负责解析select_related),它似乎使用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")

但是……这似乎不太值得:\

于 2013-10-28T05:52:52.000 回答