django - 在非主键关系上加入和查询 Django 模型?

标签 django django-models

我有两个模型,它们通过一个不是主键的字段在逻辑上相关。是否可以在不引入 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/

相关文章:

django - 如何创建在 Django 中保存 User 和 UserProfile 对象的 View

python - 在 django 中组织关系的最佳方式是什么?平坦的还是树状的?

python - Django中的多态模型继承

python - django长时间运行进程数据库连接

python - 在 Python/Django 中使用 Memcached - 问题

django - 无法安装 MySQL-python

mysql - Django——自定义过滤器或 SQL raw

python - Django 1.7 属性错误 : 'WSGIRequest' object has no attribute 'user'

mysql - 在 Mac 中将 my-sql 客户端与 Django 连接时出错

django - 分配主键整数范围