Saya memiliki model ini dan ketika saya mencoba menulis python manage.py makemigrations dikatakan

You are trying to add a non-nullable field 'id' to useraccount without a default; we can't do that (the database needs somet
hing to populate existing rows).

Model saya.py:

class UserAccount(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    Profile_Image = models.ImageField(upload_to='images/',null=True, blank=True)
    slug = models.SlugField(unique=False) # new
    def save(self, *args, **kwargs):
        if not self.id or not self.slug:
            super(UserAccount, self).save(*args, **kwargs)
            self.slug = slugify(f"{self.user}")
        super(UserAccount, self).save(*args, **kwargs)

    def get_image(self):
        if self.Profile_Image and hasattr(self.Profile_Image, 'url'):
            return self.Profile_Image.url
        else:
            return '/path/to/default/image'

    def __str__(self):
        return self.name

Apa kesalahannya di sini

0
Kok Hyvv 5 April 2021, 15:06

2 jawaban

Jawaban Terbaik

Di django, ManyToManyField dan OneToOneField Bidang tidak diperbolehkan memiliki nilai NULL.

Anda memiliki kesalahan ini karena Anda memiliki beberapa data sebelumnya (dalam database Anda) yang tidak mengikuti aturan ini. Tetapi sekarang Anda mengubah aturan basis data, pergi dengan struktur model Anda, database Anda mengharapkan semua data dalam tabel itu (sehubungan dengan model) mengikuti aturan ini.

Apa yang dapat Anda lakukan untuk memperbaiki ini adalah menghapus semua file migrasi Anda yang dihasilkan oleh model ini (ditemukan di folder migrations di dalam direktori aplikasi).

Setelah itu, jalankan kembali migrasi Anda, lalu hapus data dari tabel yang tidak mengikuti aturan ini. Untuk melindungi integritas data, (dengan asumsi ini adalah data produksi yang berfungsi) Anda mungkin lebih suka menetapkan nilai default pada bidang Anda yang akan diterapkan pada semua data yang ada.

0
Barnabas 5 April 2021, 13:49

Anda mendapatkan kesalahan ini karena Django bingung tentang apa yang harus dilakukan dengan catatan yang ada sebelum Anda membuat perubahan ini ke model Anda. Dengan asumsi bahwa proyek Anda sedang dalam pengembangan, Anda harus mempertimbangkan untuk menghapus migrasi Anda dan menjalankannya setelah Anda selesai mengkodekan untuk model Anda, jadi semuanya sama dengan sinkronisasi. BTW, file migrasi untuk setiap aplikasi ada di folder dinamai migrasi di folder aplikasi itu.

1
Mohsin Ali 5 April 2021, 13:03