【发布时间】:2017-09-09 03:09:09
【问题描述】:
我不知道如何使用涉及 ForeignKeys 和 ManyToMany 字段的 Django ORM 进行过滤。我已经做了很多谷歌搜索,但找不到类似的案例。 Django 文档也没有多大帮助。
情况是这样的。我有应用程序。一个应用可以有多个版本。这些版本具有元数据,例如它们兼容的平台版本。一个版本可以兼容多个平台版本。我想找到与特定平台版本兼容的最新版本。
所以在 Django 中,我有一个 App 模型和一个 Release 模型,其中 App 是一个 ForeignKey。我也有一个 PlatformVersion 模型。在发布模型上,我将 PlatformVersion 作为 ManyToManyField。
我想在 App 模型上创建一个方法,为我提供与特定 PlatformVersion 兼容的最新版本。它也可以与其他 PlatformVersions 兼容,我不在乎。但它至少需要与那个 PlatformVersion 兼容。
这里有一些代码:
class App(models.Model):
def get_latest_filtered_release(self, **kwargs):
platform_version = PlatformVersion.objects.get(name=kwargs.get('platform_version', None)
return self.releases.filter(platform_versions__in=platform_version).latest()
# When I try to run this I get "TypeError: 'PlatformVersion' object is not iterable" as expected
class Release(models.Model):
class Meta:
ordering = ['-created_datetime']
get_latest_by = 'created_datetime'
app = models.ForeignKey(App, related_name='releases')
platform_versions = models.ManyToManyField('PlatformVersion', related_name="platform_versions")
created_datetime = models.DateTimeField(auto_now_add=True)
class PlatformVersion(models.Model):
name = models.CharField(unique=True)
Release 有多个 PlatformVersions,因此我无法使用 = 运算符 (platform_versions=a_single_platform_version) 进行过滤。
我也不能使用__in (platform_versions__in=a_single_platform_version),因为这意味着“给我release.platform_versions 的值在a_single_platform_version(列表)中的版本”。我想要相反:“给我release.platform_versions(一个列表)包含a_single_platform_version的值”。
__contains 不幸的是仅用于字符串,而不用于评估列表中是否存在值。当我尝试使用 __contains 时收到 Related Field got invalid lookup: contains 错误。
我该怎么办?子查询?排除?有没有我缺少的过滤器?还有什么?谢谢!
【问题讨论】:
标签: python django filter orm manytomanyfield