我正在使用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()