Django IntegrityError: UNIQUE constraint failed user.id ( OnetoOneField)

Django IntegrityError: UNIQUE constraint failed user.id ( OnetoOneField)

我想将数据发送到数据库。但是错误说 return Database.Cursor.execute(self, query, params) django.db.utils.IntegrityError:唯一约束失败:dashboard_userusulan.ketua_id [27/Dec/2021 23:46:14] "POST /dashboard/usulan-penelitian/ HTTP/1.1" 500 196035

我使用 CreateView 和 form_valid() 发送数据。我希望当我单击提交按钮 字段 'ketua' 时自动创建当前用户。

models.py

class UserUsulan(models.Model):

YEAR_CHOICES = [(r,r) for r in range(1984, datetime.date.today().year+1)]

JENIS_PENELITIAN_CHOICE = (
    ('DASAR', 'Penelitian Dasar'),
    ('MADYA', 'Penelitian Madya'),
    ('UTAMA', 'Penelitian Utama'),
)

BIDANG_PENELITIAN_CHOICE = (
    ('TEKNOLOGI', 'Teknologi'),
    ('SAINS', 'Sains'),
    ('PENDIDIKAN', 'Pendidikan'),
    ('EKONOMI', 'Ekonomi'),
    ('HUKUM', 'Hukum'),
    ('MANAJEMEN', 'Manajemen'),
)

TARGET_LUARAN_CHOICE = (
    ('JURNAL INTERNASIONAL', 'Jurnal Internasional Bereputasi'),
    ('JURNAL NASIONAL', 'Jurnal Nasional Terakreditasi'),
    ('PROSIDING INTERNASIONAL', 'Prosiding Internasional'),
    ('PROSIDING NASIONAL', 'Prosiding Nasional'),
    ('HKI', 'Hak Kekayaan Intelektual'),
    ('BUKU','Buku'),
    ('PRODUK','Produk'),
)

STATUS_USULAN_CHOICE = (
    ('DITERIMA', 'Diterima'),
    ('MENUNGGU', 'Menunggu'),
    ('DITOLAK', 'Ditolak'),
)

SUMBER_DANA_CHOICE = (
    ('LP3M', 'DIPA LP3M Universitas Mulia'),
)

SKEMA_PENELITIAN_CHOICE = (
    ('L', 'Lektor'),
    ('AA', 'Asisten Ahli'),
    ('TENDIK', 'Tenaga Pengajar'),
)


tahun                       = models.IntegerField(_('year'), choices=YEAR_CHOICES, default=datetime.datetime.now().year)
judul_penelitian            = models.TextField(blank=True)
jenis_penelitian            = models.CharField(max_length=16, blank=True, default="", choices=JENIS_PENELITIAN_CHOICE)
tmt_awal                    = models.DateField(null=True, blank=True)
tmt_akhir                   = models.DateField(null=True, blank=True)
bidang_penelitian           = models.CharField(max_length=10, blank=True, default="", choices=BIDANG_PENELITIAN_CHOICE)
tujuan_sosial_ekonomi       = models.TextField(blank=True)
sumber_dana                 = models.CharField(max_length=30, blank=True, default="", choices=SUMBER_DANA_CHOICE)
skema_penelitian            = models.CharField(max_length=15, blank=True, default="", choices=SKEMA_PENELITIAN_CHOICE)
jumlah_dana_usulan          = MoneyField(max_digits=14, decimal_places=2, default_currency='IDR')
target_luaran               = models.CharField(max_length=23, blank=True, default="", choices=TARGET_LUARAN_CHOICE)
ketua                       = models.OneToOneField(settings.AUTH_USER_MODEL, related_name='ketua_penelitian', on_delete=models.CASCADE, null=True, blank=True)
anggota                     = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='anggota_penelitian')
upload_file                 = models.FileField(upload_to='Penelitian/', null=True, blank=True)
status_usulan               = models.CharField(max_length=8, blank=True, choices=STATUS_USULAN_CHOICE)
jumlah_dana_disetujui       = MoneyField(max_digits=14, decimal_places=2, default_currency='IDR', null=True, blank=True)
keterangan_operator         = models.TextField(null=True, blank=True)
com_reviewer_1              = models.TextField(null=True, blank=True)
com_reviewer_2              = models.TextField(null=True, blank=True)

views.py

class UserUsulanPenelitian(LoginRequiredMixin, CreateView):
template_name       = 'dashboard/usulan-penelitian.html'
form_class          = UserUsulanCreatePenelitianForm
success_url         = 'dashboard/usulan-penelitian'

def form_valid(self, form):
    #fetch user login data and input current user
    form.instance.ketua = self.request.user
    
    # form.save()
    print(self.request.user)
    # message.success(self.request, 'Berhasil Menambahkan Usulan Penelitian')
    print('Success Menambahkan Data')
    return super().form_valid(form)

将 ketua 字段 OneToOneField 编辑为 ForeignKey

ketua = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='ketua_penelitian', on_delete=models.CASCADE, null=True, blank=True)