在django设置学校模型

yrdbyhpb  于 2023-04-22  发布在  Go
关注(0)|答案(1)|浏览(88)

我想在Django中创建一个学校表:如果一个老师有几个教室,而一个教室只有一个老师和一个学生,而这个学生有一个教室,但一个教室有很多学生,我就像这样构建我的模型:

class Classroom(models.Model):
    classID = models.CharField(primary_key=True,validators=[MinLengthValidator(2)], max_length=50, blank=False)

class Teacher(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    school_name = models.CharField(validators=[MinLengthValidator(2)], max_length=50, blank=False)
    city = models.CharField(validators=[MinLengthValidator(2)], max_length=50, blank=False)
    classroom = models.ForeignKey(Classroom ,on_delete=models.DO_NOTHING)
    enter code here

class Student(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    fullName = models.CharField(validators=[MinLengthValidator(2)], max_length=50, blank=False)
    studentLevel = models.IntegerField(default=0)
    studentUnit = models.IntegerField(default=0)
    classroom = models.ForeignKey(Classroom ,on_delete=models.CASCADE)
    done = models.BooleanField(default=False)

当我尝试添加新老师或新学生时,我得到一个错误:

yield from iter(self._query)
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\djongo\sql2mongo\query.py", line 167, in __iter__
   yield self._align_results(doc)
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\djongo\sql2mongo\query.py", line 269, in _align_results
   if selected.table == self.left_table:
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\djongo\sql2mongo\sql_tokens.py", line 133, in table
   return alias2token[name].table
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\djongo\sql2mongo\sql_tokens.py", line 133, in table
   return alias2token[name].table
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\djongo\sql2mongo\sql_tokens.py", line 133, in table
   return alias2token[name].table
 [Previous line repeated 911 more times]
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\djongo\sql2mongo\sql_tokens.py", line 130, in table
   name = self.given_table
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\djongo\sql2mongo\sql_tokens.py", line 141, in given_table
   name = self._token.get_real_name()
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\sqlparse\sql.py", line 361, in get_real_name
   return self._get_first_name(dot_idx)
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\sqlparse\sql.py", line 386, in _get_first_name
   return token.get_name()
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\sqlparse\sql.py", line 355, in get_name
   return self.get_alias() or self.get_real_name()
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\sqlparse\sql.py", line 344, in get_alias
   _, ws = self.token_next_by(t=T.Whitespace)
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\sqlparse\sql.py", line 244, in token_next_by
   return self._token_matching(funcs, idx, end)
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\sqlparse\sql.py", line 223, in _token_matching
   if func(token):
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\sqlparse\sql.py", line 242, in <lambda>
   funcs = lambda tk: imt(tk, i, m, t)
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\sqlparse\utils.py", line 100, in imt
   elif types and any(token.ttype in ttype for ttype in types):
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\sqlparse\utils.py", line 100, in <genexpr>
   elif types and any(token.ttype in ttype for ttype in types):
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\sqlparse\tokens.py", line 19, in __contains__
   return item is not None and (self is item or item[:len(self)] == self)
RecursionError: maximum recursion depth exceeded in comparison

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\djongo\cursor.py", line 76, in fetchone
   return self.result.next()
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\djongo\sql2mongo\query.py", line 797, in __next__
   result = next(self._result_generator)
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\djongo\sql2mongo\query.py", line 830, in __iter__
   raise exe from e
djongo.exceptions.SQLDecodeError:

       Keyword: FAILED SQL: SELECT %(0)s AS "a" FROM "auth_user" WHERE "auth_user"."id" = %(1)s LIMIT 1
Params: (1, 15)
Version: 1.3.6
       Sub SQL: None
       FAILED SQL: None
       Params: None
       Version: None

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\django\db\utils.py", line 98, in inner
   return func(*args, **kwargs)
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\djongo\cursor.py", line 81, in fetchone
   raise db_exe from e
djongo.database.DatabaseError

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\django\core\handlers\exception.py", line 56, in inner
   response = get_response(request)
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
   response = wrapped_callback(request, *callback_args, **callback_kwargs)
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\django\contrib\admin\options.py", line 686, in wrapper
   return self.admin_site.admin_view(view)(*args, **kwargs)
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\django\utils\decorators.py", line 134, in _wrapped_view
   response = view_func(request, *args, **kwargs)
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\django\views\decorators\cache.py", line 62, in _wrapped_view_func
   response = view_func(request, *args, **kwargs)
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\django\contrib\admin\sites.py", line 242, in inner
   return view(request, *args, **kwargs)
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\django\contrib\admin\options.py", line 1891, in add_view
   return self.changeform_view(request, None, form_url, extra_context)
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\django\utils\decorators.py", line 46, in _wrapper
   return bound_method(*args, **kwargs)
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\django\utils\decorators.py", line 134, in _wrapped_view
   response = view_func(request, *args, **kwargs)
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\django\contrib\admin\options.py", line 1751, in changeform_view
   return self._changeform_view(request, object_id, form_url, extra_context)
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\django\contrib\admin\options.py", line 1797, in _changeform_view
   form_validated = form.is_valid()
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\django\forms\forms.py", line 205, in is_valid
   return self.is_bound and not self.errors
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\django\forms\forms.py", line 200, in errors
   self.full_clean()
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\django\forms\forms.py", line 439, in full_clean
   self._post_clean()
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\django\forms\models.py", line 492, in _post_clean
   self.instance.full_clean(exclude=exclude, validate_unique=False)
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\django\db\models\base.py", line 1448, in full_clean
   self.clean_fields(exclude=exclude)
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\django\db\models\base.py", line 1500, in clean_fields
   setattr(self, f.attname, f.clean(raw_value, self))
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\django\db\models\fields\__init__.py", line 755, in clean
   self.validate(value, model_instance)
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\django\db\models\fields\related.py", line 1088, in validate
   if not qs.exists():
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\django\db\models\query.py", line 1226, in exists
   return self.query.has_results(using=self.db)
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\django\db\models\sql\query.py", line 592, in has_results
   return compiler.has_results()
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\django\db\models\sql\compiler.py", line 1366, in has_results
   return bool(self.execute_sql(SINGLE))
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\django\db\models\sql\compiler.py", line 1409, in execute_sql
   val = cursor.fetchone()
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\django\db\utils.py", line 98, in inner
   return func(*args, **kwargs)
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\django\db\utils.py", line 91, in __exit__
   raise dj_exc_value.with_traceback(traceback) from exc_value
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\django\db\utils.py", line 98, in inner
   return func(*args, **kwargs)
 File "C:\Users\WIN10\Desktop\FunPun Full Project\BackEnd\venv\lib\site-packages\djongo\cursor.py", line 81, in fetchone
   raise db_exe from e
django.db.utils.DatabaseError

从审查的错误,它说的递归数量,但我不明白为什么会发生这种情况

vsdwdz23

vsdwdz231#

很抱歉回复得太短,没有太多的时间来解释。我想你的外键关系是反过来的。我还添加了related_name
试试这个:

class Classroom(models.Model):
    classID = models.CharField(primary_key=True,validators=[MinLengthValidator(2)], max_length=50, blank=False)
    classroom = models.ForeignKey(Teacher,related_name='classrooms',on_delete=models.DO_NOTHING)
    
class Teacher(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    school_name = models.CharField(validators=[MinLengthValidator(2)], max_length=50, blank=False)
    city = models.CharField(validators=[MinLengthValidator(2)], max_length=50, blank=False)
    
class Student(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    fullName = models.CharField(validators=[MinLengthValidator(2)], max_length=50, blank=False)
    studentLevel = models.IntegerField(default=0)
    studentUnit = models.IntegerField(default=0)
    classroom = models.ForeignKey(Classroom,related_name='students',on_delete=models.CASCADE)
    done = models.BooleanField(default=False)

要获得更深入的解释,您可以阅读many-to-one relationships上的Django文档

相关问题