我目前正在使用 Django (1.5.1) 开发一个项目,但我遇到了 Django ORM 的一些问题。
我有如下实现的模型(我只列出了那些针对我的问题的模型):
class Download(models.Model):
"""
Represents a unit of download with many files
"""
download_id = models.IntegerField(db_index=True, primary_key=True, null=False)
name = models.CharField(max_length=1024, null=False)
我必须创建一个页面,其中列出了下载的文件(来自下载模型)以及来自其他表的特定数据。所以我在我的数据库中创建了一个 SQL 视图,然后我在 Django 中将此视图与以下模型一起使用:
class DownloadedFiles(models.Model):
id = models.IntegerField(null=False, primary_key=True)
file_name = models.CharField(max_length=1024)
added_date = models.DateTimeField()
class Meta:
managed = False
db_table = "file_list"
我使用以下方法调用它:
data = DownloadedFiles.objects.all()
我的视图没有任何问题,它返回我需要的结果,这很好。
但现在我想使用其他表中的字段而不是我的视图来过滤我的结果。例如,我想使用“下载”模型中的“文件名”字段过滤我的结果。在 SQL 中,这将是这样的:
SELECT * FROM file_list
INNER JOIN download ON download.id=file_list.id
WHERE download.file_name LIKE '%something%';
我想使用 ORM 函数,例如
DownloadedFiles.objects.filter(download__file_name__contains="something").
不幸的是,由于我的“DownloadedFiles”模型中不知道“Download”模型(没有引用它),Django ORM 无法建立任何关系。此外,我找不到可以显式创建 JOIN 的方法。谷歌搜索它提供了一些方法,但没有一个有效(所有抛出的异常):
- 使用额外()
FieldError: Cannot resolve keyword 'download' into field. Choices are: file_name, added_date, id
:。 - 使用 join() ( http://www.caktusgroup.com/blog/2009/09/28/custom-joins-with-djangos-queryjoin/ ):
DatabaseError: column download.id does not exist
。 - 为我的视图模型添加一些外键以便与其他表建立关系:与 extra() 相同。
也许我没有很好地实施这些解决方案,或者在我的情况下它们完全没用。我想知道是否有人已经面临这种情况以及如何解决它。
谢谢