我正在使用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解决方法将非常感激。
答案 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)