Python ValueError:无法分配";4749890231992320L“&引用;学生.用户“;必须是一个";“用户”;例如。(Django和定制型号)

Python ValueError:无法分配";4749890231992320L“&引用;学生.用户“;必须是一个";“用户”;例如。(Django和定制型号),python,django,django-models,Python,Django,Django Models,我在使用Model.objects.get自定义模型时遇到问题,该自定义模型将标准Django用户作为字段之一。以下是基本属性: class Student(models.Model): user = models.ForeignKey(User, unique=True) school = models.ForeignKey(School) isHead = models.BooleanField() 我创建了一个新的学校,用户,和学生,并毫无问题地保存了它们。因此,

我在使用
Model.objects.get
自定义模型时遇到问题,该自定义模型将标准Django用户作为字段之一。以下是基本属性:

class Student(models.Model):
    user = models.ForeignKey(User, unique=True)
    school = models.ForeignKey(School)
    isHead = models.BooleanField()
我创建了一个新的
学校
用户
,和
学生
,并毫无问题地保存了它们。因此,我在
manage.py shell
中键入了以下内容,其中
new
User
对象的变量:

Student.objects.get(user = new)
然后,我得到一个错误:

ValueError: Cannot assign "5312840185413632L": "Student.user" must be a "User" instance.
我做了一些研究,我理解上面的意思是我传递的不是
用户
对象的东西作为参数。然而,我已经定义了

new = User(username="new user")
所以我不知道我做错了什么

任何帮助都将不胜感激。如果有帮助的话,我正在Eclipse中工作,这对我来说是新的,尽管Django/python不是

编辑:以下是自定义类的完整代码:

class School(models.Model):
    def level(self):
        return get_max_triangle_num_less_than(self.rep / SCHOOL_REP_LEVEL_MODIFIER)

    name = models.CharField(max_length=64)
    # Rep could also be a DecimalField (needs max_digits and decimal_places specified)
    rep = models.IntegerField(default = 0)
    num_students = models.IntegerField(default = 0)

    def __init__(self, name, *args, **kwargs):
        models.Model.__init__(self, *args, **kwargs)
        self.name = name

    def __str__(self, *args, **kwargs):
        return self.name + ", " + str(self.num_students) + " students"

class Student(models.Model):

    def level(self):
        return get_max_triangle_num_less_than(self.rep / STUDENT_REP_LEVEL_MODIFIER)

    user = models.ForeignKey(User, unique=True)
    school = models.ForeignKey(School)
    isHead = models.BooleanField()

    referral_code = models.CharField(max_length=128, unique=True)
    referred_by = models.ForeignKey(User, blank=True, null=True)

    rep = models.IntegerField(default = 0)

    def __init__(self, user, school, referred_by = None, *args, **kwargs):
        models.Model.__init__(self, *args, **kwargs)
        self.user = user
        self.school = school
        if referred_by:
            self.referred_by = referred_by

        # This automatically creates a custom string of letters/numbers -- I thought it was 
        #  the easiest way to make a custom "referral code" which can be used to link a 
        #  registration to the referrer
        self.referral_code = str(uuid.uuid4())

        self.school.num_students += 1

    def __str__(self):
        something = str(self.user.username)
        if self.isHead:
            something += ", Head at "
        else:
            something += ", at "
        something += self.school.name + ", " + str(self.rep) + " rep points"
        return something
下面是我在shell+回溯中输入的内容:

>>> from spudmart.campusrep.models import User, School, Student
>>> usr = User(username="user")
>>> usr.save()
>>> sch = School(name = "school")
>>> sch.save()
>>> stu = Student(user = usr, school = sch)
>>> stu.save()
>>> Student.objects.get(user = usr)

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/Users/Lucy/Code/Git/spudder/spudmart/src/django/db/models/manager.py", line 132, in get
    return self.get_query_set().get(*args, **kwargs)
  File "/Users/Lucy/Code/Git/spudder/spudmart/src/django/db/models/query.py", line 346, in get
    num = len(clone)
  File "/Users/Lucy/Code/Git/spudder/spudmart/src/django/db/models/query.py", line 82, in __len__
    self._result_cache = list(self.iterator())
  File "/Users/Lucy/Code/Git/spudder/spudmart/src/django/db/models/query.py", line 288, in iterator
    obj = model(*row[index_start:aggregate_start], **{'__entity_exists': True})
  File "/Users/Lucy/Code/Git/spudder/spudmart/src/spudmart/campusrep/models.py", line 51, in __init__
    self.user = user
  File "/Users/Lucy/Code/Git/spudder/spudmart/src/django/db/models/fields/related.py", line 331, in __set__
    self.field.name, self.field.rel.to._meta.object_name))
ValueError: Cannot assign "4661929301770240L": "Student.user" must be a "User" instance.
>>从spudmart.campusrep.models导入用户、学校、学生
>>>usr=用户(用户名=“用户”)
>>>usr.save()
>>>sch=学校(name=“学校”)
>>>sch.save()
>>>stu=学生(用户=usr,学校=sch)
>>>stu.save()
>>>Student.objects.get(user=usr)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
get中第132行的文件“/Users/Lucy/Code/Git/spudder/spudmart/src/django/db/models/manager.py”
返回self.get\u query\u set().get(*args,**kwargs)
get中的文件“/Users/Lucy/Code/Git/spudder/spudmart/src/django/db/models/query.py”,第346行
num=len(克隆)
文件“/Users/Lucy/Code/Git/spudder/spudmart/src/django/db/models/query.py”,第82行,在__
self.\u result\u cache=list(self.iterator())
迭代器中的文件“/Users/Lucy/Code/Git/spudder/spudmart/src/django/db/models/query.py”,第288行
obj=model(*行[索引开始:聚合开始],**{“实体存在”:True})
文件“/Users/Lucy/Code/Git/spudder/spudmart/src/spudmart/campusrep/models.py”,第51行,在__
self.user=用户
文件“/Users/Lucy/Code/Git/spudder/spudmart/src/django/db/models/fields/related.py”,第331行,在__
self.field.name,self.field.rel.to.\u meta.object\u name))
ValueError:无法分配“4661929301770240L”:“Student.user”必须是“user”实例。

在更仔细地研究了回溯之后——我真的应该首先做回溯——我尝试注释代码以覆盖
\uuuu init\uuu
方法。瞧,它成功了!这个故事的寓意是:在询问互联网之前,要更仔细地查看回溯。谢谢大家的帮助

您在模型中执行了一些奇怪的操作
\uuuu init\uuuu
,您需要将所有这些逻辑移动到
save()
方法,必须是这样的:

class Student(models.Model):

def level(self):
    return get_max_triangle_num_less_than(self.rep / STUDENT_REP_LEVEL_MODIFIER)

user = models.ForeignKey(User, unique=True)
school = models.ForeignKey(School)
isHead = models.BooleanField()

referral_code = models.CharField(max_length=128, unique=True)
referred_by = models.ForeignKey(User, blank=True, null=True)

rep = models.IntegerField(default = 0)

def __str__(self):
    something = str(self.user.username)
    if self.isHead:
        something += ", Head at "
    else:
        something += ", at "
    something += self.school.name + ", " + str(self.rep) + " rep points"
    return something

def save(self, *args, **kwargs):
    if self.pk is None:  # if this is new object (not update)
        self.school.num_students += 1
        self.referral_code = str(uuid.uuid4())
    instance = super(Student, self).save(*args, **kwargs)
    return instance

它发生在我使用其他变量名时。。。我刚刚用“usr_3”作为变量名再试了一次,得到了相同的结果,数字略有不同,但同样的错误向我们显示了您的完整代码感谢
如果self.pk是None
建议,我就不会听到了。