簡體   English   中英

ValueError:無法分配“ 4749890231992320L”:“ Student.user”必須是“ User”實例。 (Django +自定義模型)

[英]ValueError: Cannot assign “4749890231992320L”: “Student.user” must be a “User” instance. (Django + custom models)

我在將Model.objects.get與包含標准Django用戶作為字段之一的自定義模型一起使用時遇到問題。 基本屬性如下:

class Student(models.Model):
    user = models.ForeignKey(User, unique=True)
    school = models.ForeignKey(School)
    isHead = models.BooleanField()

我創建了一個新的SchoolUserStudent ,並毫無問題地保存了它們。 因此,我將以下內容輸入到manage.py shell ,其中newUser對象的變量:

Student.objects.get(user = new)

然后,我得到錯誤:

ValueError: Cannot assign "5312840185413632L": "Student.user" must be a "User" instance.

我已經進行了一些研究,並且我理解上述內容意味着要傳遞的內容不是 User對象作為參數。 但是,我已經定義

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.

在更仔細地查看了回溯(我本來應該做的)之后,我嘗試注釋掉代碼以覆蓋__init__方法。 瞧,它成功了! 故事的寓意:在詢問互聯網之前,先仔細研究一下追溯。 謝謝大家的幫助!

您正在模型__init__中做一些奇怪的事情,您需要將所有這些邏輯移到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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM