Python Django with MySQL:OperationalError(1054,';where子句';中的“未知列';”在尝试查询多对多关系时出错
我意识到之前有很多问题的标题都很相似,但它们的背景不同。我还没有找到一个与Django和我的特殊情况有关的答案 我在Django的两个模型之间有一个多对多关系,如下所示:Python Django with MySQL:OperationalError(1054,';where子句';中的“未知列';”在尝试查询多对多关系时出错,python,mysql,django,Python,Mysql,Django,我意识到之前有很多问题的标题都很相似,但它们的背景不同。我还没有找到一个与Django和我的特殊情况有关的答案 我在Django的两个模型之间有一个多对多关系,如下所示: class User(models.Model): user = models.OneToOneField(settings.AUTH_USER_MODEL, primary_key=True) def __unicode__(self): return self.user.username
class User(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, primary_key=True)
def __unicode__(self):
return self.user.username
class Course(models.Model):
users = models.ManyToManyField(User, through='UsersTakeCourses')
title = models.CharField(max_length = 128)
description = models.CharField(max_length = 1024)
def __str__(self):
return self.title
class UsersTakeCourses(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
course = models.ForeignKey(Course, on_delete=models.CASCADE)
mark = models.IntegerField()
在Django的views.py中,给定一个用户名,我想查询数据库,以便检索特定用户正在学习的所有课程。这是我的看法:
def my_courses(request, user_name):
current_user = User.objects.get(username=user_name)
current_user_courses = Course.objects.filter(users__pk=current_user.pk)
context_dict = {'user_courses': current_user_courses}
return render(request, 'FAProject_app/my_courses.html', context_dict)
但是,当我运行服务器并尝试加载与此视图相关的页面时,会收到以下错误消息:
操作错误位于/firstaid/my courses/testuser/(1054),未知
“where子句”中的“FAProject\u app\u userstakecourses.user\u id”列)
我意识到这可能是mySQL查询中的一个语法错误,但是我不知道在Django构建查询时会发生这种情况
非常感谢您的帮助。问题就在这里
current_user_courses = Course.objects.filter(users__pk=current_user.pk)
试试看
[旧]
[现在]
因为在多对多关系中,这会创建新的映射表,而没有直接的多对多字段。问题就在这里
current_user_courses = Course.objects.filter(users__pk=current_user.pk)
试试看
[旧]
[现在]
因为在多对多关系中,这会创建新的映射表,而没有直接的多对多字段。您正在为多对多字段使用中间表。您应该通过该中间表获得用户课程。一个简单的方法是像这样使用
related\u name
class UsersTakeCourses(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user_courses')
course = models.ForeignKey(Course, on_delete=models.CASCADE, related_name='courses_taken_by_users')
mark = models.IntegerField()
current_user = User.objects.get(username=user_name)
current_user_courses_id = current_user.user_courses.all().values_list('course', flat=True)
current_user_courses = Course.objects.filter(id__in=current_user_courses_id)
当您在此表中管理用户
和课程
关系时,您不需要课程
表中的用户
。您可以获得这样的用户参加的课程
class UsersTakeCourses(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user_courses')
course = models.ForeignKey(Course, on_delete=models.CASCADE, related_name='courses_taken_by_users')
mark = models.IntegerField()
current_user = User.objects.get(username=user_name)
current_user_courses_id = current_user.user_courses.all().values_list('course', flat=True)
current_user_courses = Course.objects.filter(id__in=current_user_courses_id)
或
您正在为许多字段使用中间表。您应该通过该中间表获得用户课程。一个简单的方法是像这样使用
related\u name
class UsersTakeCourses(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user_courses')
course = models.ForeignKey(Course, on_delete=models.CASCADE, related_name='courses_taken_by_users')
mark = models.IntegerField()
current_user = User.objects.get(username=user_name)
current_user_courses_id = current_user.user_courses.all().values_list('course', flat=True)
current_user_courses = Course.objects.filter(id__in=current_user_courses_id)
当您在此表中管理用户
和课程
关系时,您不需要课程
表中的用户
。您可以获得这样的用户参加的课程
class UsersTakeCourses(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user_courses')
course = models.ForeignKey(Course, on_delete=models.CASCADE, related_name='courses_taken_by_users')
mark = models.IntegerField()
current_user = User.objects.get(username=user_name)
current_user_courses_id = current_user.user_courses.all().values_list('course', flat=True)
current_user_courses = Course.objects.filter(id__in=current_user_courses_id)
或
最终解决了这个问题。这是因为我有一个不必要的用户表,它的唯一目的是与auth_用户表进行一对一的链接。我删除了这个,并将我的多对多更改为直接从auth_user表中获取用户名。最终解决了这个问题。这是因为我有一个不必要的用户表,它的唯一目的是与auth_用户表进行一对一的链接。我删除了这个,并将我的多对多更改为直接从auth_user表中获取用户名。感谢您的回复。我将行更改为您建议的行,现在出现以下错误:ValueError at/firstaid/my courses/testuser/无法查询“testuser”:必须是“User”实例。现在我得到以下错误:OperationalError at/firstaid/my courses/testuser/(1054,“where子句”中的未知列“FAProject\u app\u userstakecourses.User\id”)您是否忘记运行make migrations和migrate命令?检查您的表,确定列是否存在。在映射表中。感谢您的回复。我将行更改为您建议的行,现在出现以下错误:ValueError at/firstaid/my courses/testuser/无法查询“testuser”:必须是“User”实例。现在我得到以下错误:OperationalError at/firstaid/my courses/testuser/(1054,“where子句”中的未知列“FAProject\u app\u userstakecourses.User\id”)您是否忘记运行make migrations和migrate命令?检查您的表,确定列是否存在。在映射表中。我从您编写的第二行代码中得到此错误:AttributeError at/firstaid/my courses/testuser/“User”对象没有属性“User\u courses”,您需要如我所述更改您的模型并运行迁移。我确实更改了模型并运行了迁移。您的
身份验证用户\u模型是什么具有用户名和密码的标准身份验证用户。我从您编写的第二行代码中得到此错误:AttributeError at/firstaid/my courses/testuser/'user'对象没有属性'user\u courses',您需要更改我提到的模型并运行迁移。我确实更改了模型并运行了迁移。您的建议是什么AUTH\u USER\u MODEL
?我认为它只是一个带有用户名和密码的标准AUTH用户。很好,你找到了解决方案。很好,你找到了解决方案。