在非主键关系上连接和查询 Django 模型?

2023-12-29

我有两个模型通过非主键的字段在逻辑上相关。是否可以查询它们(例如,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/#extratables 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(使用前将#替换为@)

在非主键关系上连接和查询 Django 模型? 的相关文章

随机推荐