【问题标题】:Why doesn't self.object in a CreateView have an id after saving to the database?为什么 CreateView 中的 self.object 保存到数据库后没有 id?
【发布时间】:2014-10-02 11:30:07
【问题描述】:

在对django createview how to get the object that is created 上已接受答案的评论之后,我尝试使用CreateView 在其get_success_url 方法中创建的用户的ID。然而,即使它肯定被保存到 MySQL 并接收到一个 id,当我访问self.object 时,它也没有一个可用的 id。该模型确实具有id 属性。为什么我无法访问该 ID?如果我被链接的评论误入歧途,那么获取 id 的正确方法是什么?

参考代码:

models.py

from django.db import models

class User(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=128)
    active = models.BooleanField(blank=True)
    created_date = models.DateTimeField()
    class Meta:
        managed = False
        db_table = 'user'
    def __unicode__(self):
        return self.name

views.py

from django.views.generic import CreateView
from django.core.urlresolvers import reverse
from forms import AddUserForm

class AddUserView(CreateView):
    form_class = AddUserForm
    fields = ['name', 'active'] # id and created_date are auto-filled upon save
    template_name = 'webApp/add_user_form.html'

    def get_success_url(self):
        print self.object # Prints the name of the submitted user
        print self.object.id # Prints None
        return reverse("webApp:user:stepTwo", args=(self.object.id,))

【问题讨论】:

    标签: python mysql django django-class-based-views


    【解决方案1】:

    它是空白的,因为该对象实际上并没有收到一个 id。这是因为 id 字段应该是 AutoField,而不是 IntegerField,因此它被声明为自动递增。

    其实你根本不应该声明它:一个名为 id 的主键 AutoField 是the default,所以你应该把它去掉。

    请注意,在进行此更改后,您需要迁移数据库表,或者删除并重新创建它。

    【讨论】:

    • 太棒了!我刚刚使用inspectdb 提出了那个模型,所以我很惊讶问题就在那里。现在检查并删除我所有的 id 字段...
    • 是的,inspectdb 应该被认为是一个草稿,而不是您的架构的完整翻译。外键也有问题。
    • 哦,关于外键问题有什么一般性的建议吗?我还没有遇到他们的问题。
    猜你喜欢
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 2012-02-10
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多