Django 'in' 语句在数据库上不受支持 [大规模]



我正在使用Django,但收到一个错误,说"这个版本的MySQL尚不支持'LIMIT & IN/ALL/ANY/SOME subquery'"。

我的数据库结构大致如下:

    class ImageTag(models.Model):
        start_image = models.ForeignKey(Image)
        stop_image = models.ForeignKey(Image)
        tag = models.TextField(null=True)
    class Image(models.Model):
        [things we don't really care about right now]

我正在尝试做的是获取所有 ImageTag 对象的start_image字段中出现的唯一 Image 对象(注意:不是值,我需要实际对象)。 我是怎么做的:

    tag_match = [filtering all tags based on a query]
    ids = tag_match.values('start_image').distinct()  #get the distinct image ids
    images = Image.objects.filter(id__in=ids)   #get the actual image objects

这是我能看到的最简单、最直接的方式来获取具有关联 ImageTag 对象的唯一 Image 对象,但我的数据库后端不支持它。 我已经看到了一些关于如何使用原始SQL解决此问题的建议,但是如果可能的话,我真的很想避免这种情况,因为我们的开发设置和生产设置之间的差异(为什么这首先是一个问题)使得很难知道什么实际上会起作用,什么不会起作用。

这个问题

的某种 Django 解决方法将不胜感激。

问题来自MySQL本身,而不是来自Python或Django - 你会在PHP FWIW中遇到同样的问题: MySQL - 此版本的MySQL尚不支持'LIMIT & IN/ALL/ANY/SOME 子查询

Django 中的解决方法非常简单:传递一个普通列表,而不是ValueQuerySet(这将导致 SQL 子查询),即:

tag_match = [filtering all tags based on a query]
ids = list(tag_match.values_list('start_image', flat=True).distinct())  
images = Image.objects.filter(id__in=ids)  

这是获取不同图像对象的另一种方法。请尝试并告知这是否有效。

class ImageTag(models.Model):
    start_image = models.ForeignKey(Image, related_name="start_image_tags")
    stop_image = models.ForeignKey(Image)
    tag = models.TextField(null=True)
# Fetch only those Image objects which have a related ImageTag
images = Image.objects.exclude(start_image_tags=None).distinct()
# Fetch Image objects for filtered ImageTag query
tag_match = ImageTag.objects.filter(tag="any_filter")
images = Image.objects.filter(start_image_tags__in=tag_match).distinct()

相关内容

  • 没有找到相关文章

最新更新