繁体   English   中英

通过一个对象匹配的ManyToMany关系进行Python / Django ORM过滤

[英]Python/Django ORM filter by ManyToMany relationship where one object matches

我无法集中精力讨论如何使用涉及外键和ManyToMany字段的Django ORM进行过滤。 我已经进行了大量的谷歌搜索,但是找不到类似的情况。 Django文档也无济于事。

这是情况。 我有应用程序。 一个应用可以有多个版本。 这些版本具有元数据,例如与它们兼容的平台版本。 一个发行版可以与多个平台版本兼容。 我想找到与特定平台版本兼容的最新版本。

因此,在Django中,我有一个App模型和一个Release模型,其中App是ForeignKey。 我也有一个PlatformVersion模型。 在发布模型上,我将PlatformVersion作为ManyToManyField。

我想在App模型上创建一个方法,该方法为我提供了与特定PlatformVersion兼容的最新Release。 它也可以与其他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)

发布版本具有多个PlatformVersions,因此我无法使用=运算符( platform_versions=a_single_platform_version )进行过滤。

我也不能使用__inplatform_versions__in=a_single_platform_version ),因为这意味着“给我发布release.platform_versions值在a_single_platform_version(列表)中的位置”。 我想反过来:“给我发布版本,其中release.platform_versions(列表)包含a_single_platform_version的值”。

不幸的是, __contains仅用于字符串,而不用于评估列表中是否存在值。 我收到一个“ Related Field got invalid lookup: contains尝试使用__containsRelated Field got invalid lookup: contains错误。

我该怎么办? 子查询? 排除? 我是否缺少过滤器? 还有吗 谢谢!

版本具有多个PlatformVersions,因此我无法使用=运算符(platform_versions = a_single_platform_version)进行过滤。

实际上,这是正确的方法,在多对多字段上进行相等比较意味着必须存在指定的值,但允许其他值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM