创建一个Django字段,其行为类似于ForeignKey,但通过连接查询?

时间:2013-10-12 02:20:25

标签: django django-models

我有两个数据库表,它们通过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>

1 个答案:

答案 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")

但是......这似乎不值得:\