gpt4 book ai didi

django - 创建一个行为类似于外键但通过连接查询的 Django 字段?

转载 作者:行者123 更新时间:2023-12-02 11:57:26 24 4
gpt4 key购买 nike

我有两个数据库表,它们通过 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),它允许我查询与 SurveyResponse 相关的 Person ,如果存在的话?

例如,这样我就可以使用 select_lated 来确保查询高效:

>>> 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 的 relationships .

请注意:我不想使用外键:我正在处理的记录是铅笔和-纸质表格,不能保证数字会匹配。在您认为我错了之前,请考虑一下这是一个简化的示例,而且事实上我确实、诚实地知道如何使用 ForeignKey字段。

最佳答案

好的!因此,经过一番深入挖掘后,似乎这是不可能的……至少在任何一般意义上都是如此。具体来说,查看 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")

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

关于django - 创建一个行为类似于外键但通过连接查询的 Django 字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19329779/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com