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

时间:2014-02-11 17:55:33

标签: python mysql sql django

我正在使用Django,并收到一条错误消息“此版本的MySQL尚不支持'LIMIT& IN / ALL / ANY / SOME子查询'”。

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

    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解决方法将非常感激。

2 个答案:

答案 0 :(得分:0)

这是获取不同Image对象的另一种方法。如果有效,请尝试告诉我们。

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()

答案 1 :(得分:0)

问题来自MySQL本身,而不是来自Python或Django - 您在PHP FWIW中遇到同样的问题:MySQL - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery

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)  
相关问题