【问题标题】:Django Make ContentType Not RequiredDjango Make ContentType 不需要
【发布时间】:2011-08-01 08:36:45
【问题描述】:

我有这个模型:

class Auth(models.Model):
    TYPES = (
         ('agent', 'Agent'),
         ('broker', 'Broker'),
     )
    user = models.ForeignKey(User, unique=True)
    type = models.CharField(max_length=20, choices=TYPES)
    applied = models.BooleanField()
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField(db_index=True)
    content_object=generic.GenericForeignKey('content_type', 'object_id')

每当我做这样的事情时:

User.objects.create_user(username="myuser", password="myuser", email="myemail.com")
u = User.objects.get(username="myuser")
profile = Auth(user=u)
profile.save()

当然我会收到错误:

IntegrityError: (1048, "Column 'content_type_id' cannot be null")

出于我的目的,我无法避免使用内容类型,因为 Auth 是代理和代理类继承自的类,它允许我执行多个自定义配置文件。

我想知道是否有一种不需要内容类型的方法。

提前致谢!

【问题讨论】:

    标签: python django content-type


    【解决方案1】:

    要么给该字段一个 default=... 值,要么将其设置为 null=True

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 尝试将 content_type 和 object_id 设置为 null,但没有成功。在 content_object 上设置它会出错
      【解决方案3】:
      content_type = models.ForeignKey(ContentType, null=True, blank=True)
      

      null=True 在数据模型中使其成为可选,blank=True 在使用管理表单时使其成为可选(否则会出现验证错误)。

      【讨论】:

      • 你重新生成数据库结构了吗?
      • 哎呀。哈哈。我忘记了。我选择这个答案是因为它更完整。谢谢
      • 我也必须将object_id 设为可选:object_id = models.PositiveIntegerField(db_index=True, null=True, blank=True)
      【解决方案4】:

      好的,我今天用 django 1.8 遇到了同样的问题

      models.py:

      class Author(models.Model):
          user = models.OneToOneField(User)
          name = models.CharField(max_length=50)
          sig = models.CharField(max_length=150)
          up_num = models.IntegerField(default=0)
      
          def __unicode__(self):
              return self.user.username
      

      views.py:

      def register(request):
          if request.method == 'POST':
              form = registerFrom(request.POST)
              if form.is_valid():
                  username = form.cleaned_data['username']
                  email = form.cleaned_data['email']
                  password = form.cleaned_data['password']
                  name = form.cleaned_data['name']
                  sig = form.cleaned_data['sig']
                  u = User.objects.create_user(username, email, password)
      
                  add_blog_permission = Permission.objects.create(codename='add_blog')
                  change_blog_permission = Permission.objects.create(codename='change_blog')
                  delete_blog_permission = Permission.objects.create(codename='delete_blog')
                  add_comment_permission = Permission.objects.create(codename='add_comment')
                  add_message_permission = Permission.objects.create(codename='add_message')
                  delete_message_permission = Permission.objects.create(codename='delete_message')
                  u.user_permissions.add(add_blog_permission, change_blog_permission, delete_blog_permission, add_comment_permission, add_message_permission, delete_message_permission)
      
      
                  Author.objects.create(user=u, name=name, sig=sig)
                  return HttpResponseRedirect(reverse('login', args=()))
          form = registerFrom()
          return render(request, 'register.html', {'form': form})
      

      运行服务器后注册页面,提交数据时:

      IntegrityError: (1048, "Column 'content_type_id' cannot be null")
      

      最后,我发现我的代码有错误:

      add_blog_permission = Permission.objects.create(codename='add_blog')
      

      应该是:

      add_blog_permission = Permission.objects.get(codename='add_blog')
      

      【讨论】:

      • 我在学习时遇到了错误,然后我明白为什么会这样
      猜你喜欢
      • 2020-06-13
      • 2013-09-17
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 2015-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多