我有两个模型通过非主键的字段在逻辑上相关。是否可以查询它们(例如,select_related(…)
)而不引入ForeignKey
column?
例如,考虑人为的模型:
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() https://docs.djangoproject.com/en/1.8/ref/models/querysets/#extra与tables
option.
LogEntry.objects.extra(
tables=['logsource'],
where=['logsource.name=logentry.source_name',
'logsource_domain="example.com"',
]
)
另一种选择是改变source_name
外键,但指定db_column https://docs.djangoproject.com/en/1.8/ref/models/fields/#db-column and to_field https://docs.djangoproject.com/en/1.8/ref/models/fields/#django.db.models.ForeignKey.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
to source
转换为外键后,但这不是必需的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)