【问题标题】:Null value in column "user_id" violates not-null constraint in Django 1.9“user_id”列中的空值违反了 Django 1.9 中的非空约束
【发布时间】:2016-06-01 14:09:39
【问题描述】:

我已经用尽了所有方法来尝试为此制定一个解决方案,但我目前对 Python 和 Django 的了解只能让我到此为止。

我正在创建一个基本的票务系统,并且 CreateView 过去一直工作,直到我创建了一个 Profile 模型,然后将 Ticket 模型分离到它自己的应用程序中。当我重构我的代码时已经创建了几张票,这就是为什么我知道 ListView 有效,DeleteView 和 DetailView 一样有效。 CreateView 一直有效,直到我点击保存按钮。

我的观点和模型如下;我希望有人可以帮我解决这个问题。

票证模型

from django.db import models
from django.contrib.auth.models import User
....
from qcapp.models import Profile


class Ticket(models.Model):
    # Relations
    user = models.ForeignKey(Profile, on_delete=models.CASCADE, related_name="tickets", verbose_name="user")
    # Attributes
    title = models.CharField(max_length=250, verbose_name="Title", help_text="Enter a Ticket Title")
    color = models.CharField(max_length=7,
                             default="#ffffff",
                             validators=[RegexValidator("(^#[0-9a-fA-F]{3}$)|(^#[0-9a-fA-F]{6}$)")],
                             verbose_name="Color",
                             help_text="Enter the hex color code, like #ccc or #cccccc")
    description = models.TextField(max_length=1000)
    created_date = models.DateTimeField(default=timezone.now, verbose_name='Created Date')
    created_by = models.ForeignKey(User, related_name='created_by_user')
    # Attributes
    # Object Manager
    objects = managers.ProjectManager()

    # Meta and String
    class Meta:
        verbose_name = "Ticket"
        verbose_name_plural = "Tickets"
        ordering = ("user", "title")
        unique_together = ("user", "title")

    def __str__(self):
        return "%s - %s" % (self.user, self.title)

    def get_absolute_url(self):
        return reverse('ticket_detail', args=[str(self.id)])

工单视图(仅限 CreateView)

# -*- coding: utf-8 -*-
...
from django.views.generic import CreateView, UpdateView, DeleteView
...
from .models import Ticket


...

class TicketCreate(CreateView):
    model = Ticket
    template_name = "tickets/ticket_form.html"
    fields = ['title', 'description']

    def form_valid(self, form):
        form.instance.created_by = self.request.user
        return super(TicketCreate, self).form_valid(form)

...

Profile Model(导入Ticket Model)

from django.db import models
from django.conf import settings
from django.contrib.auth.models import User
from django.dispatch import receiver
from django.db.models.signals import post_save
from . import managers


class Profile(models.Model):
    # Relations
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="profile", verbose_name="user")
    # Attributes
    interaction = models.PositiveIntegerField(default=0, verbose_name="interaction")
    # Attributes
    # Object Manager
    objects = managers.ProfileManager()

    # Custom Properties
    @property
    def username(self):
        return self.user.username

    # Methods

    # Meta and String
    class Meta:
        verbose_name = "Profile"
        verbose_name_plural = "Profiles"
        ordering = ("user",)

    def __str__(self):
        return self.user.username


@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_profile_for_new_user(sender, created, instance, **kwargs):
    if created:
        profile = Profile(user=instance)
        profile.save()

【问题讨论】:

  • 您在保存时遇到了什么问题? TicketProfile 或两者兼而有之?我将假设Ticket。如果是这种情况,您分配的是 created_by 字段,但您没有分配 user
  • 配置文件运行良好...只需将其添加到此票证中,以防它与解决方案相关。您能否提供一个将用户分配给工单的示例?谢谢。
  • 在你的TicketCreateform_valid() 你已经这样做了:form.instance.created_by = self.request.user 所以我认为你需要这样做:form.instance.user = self.request.user
  • 我将 form.instance 更改为您建议的内容并收到错误 Cannot assign "<SimpleLazyObject: <User: charles>>": "Ticket.user" must be a "Profile" instance. 我猜这就是我在上面包含 Profile 模型的原因。
  • 啊,对不起,我错过了用户是Profile 的外键。然后,您将必须获取创建票证的用户的Profile(假设应该是user)并以这种方式分配它。

标签: django django-models django-forms django-templates django-views


【解决方案1】:

您似乎需要在form_valid 函数中的TicketCreate 类中添加以下内容:

form.instance.user = Profile.objects.get(user=self.request.user)

让我知道这是否有效!

【讨论】:

  • 正是需要的!谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-03-30
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
  • 1970-01-01
  • 2020-11-28
  • 1970-01-01
  • 2019-04-08
相关资源
最近更新 更多