我有两个模型,它们通过一个不是主键的字段在逻辑上相关。是否可以在不引入 select_related(…)
的情况下查询它们(例如, ForeignKey
)柱子?
例如,考虑人为的模型:
class LogEntry(Model):
source_name = CharField(…)
log_message = CharField(…)
class LogSource(Model):
name = CharField(…)
domain = CharField(…)
我希望能够查询
LogEntry
,加入并过滤相关 LogSource
(例如,这样我就可以访问 log_entry.source
而无需额外查询):LogEntry.objects
.select_related(
source=Join(LogSource, on="logsource.name = logentry.source_name")),
)
.filter(source__domain="example.com")
在不引入外键的情况下这可能吗?
最佳答案
您应该可以通过使用 extra()
来做到这一点。与 tables
选项。
LogEntry.objects.extra(
tables=['logsource'],
where=['logsource.name=logentry.source_name',
'logsource_domain="example.com"',
]
)
另一种选择是更改
source_name
到外键,但指定 db_column
和 to_field
使用现有列的参数。我知道你说你不想添加外键,但这可能是可以接受的,因为它只更改模型,而不是数据库表中的列。但是,请注意 Django 可能想要创建外键约束。一种黑客方法是伪造该迁移,以便不会在数据库中创建约束。class LogEntry(Model):
source_name = models.ForeignKey(db_column=source_name', to_field='name')
log_entry.source_name
那么将是 LogSource
实例,和 log_entry.source_name_id
将是存储在 source_name
中的值柱子。从 source_name
重命名该字段可能是有意义的至 source
转换为外键后,但这不是必需的。
关于django - 在非主键关系上加入和查询 Django 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31735717/