Saya memiliki warisan antara kelas Karyawan dan Manajer. Karyawan - superclass, Manajer - subclass.

class Employee(models.Model):
    ###
    name = models.CharField(max_length=50, null=False)
    address = models.CharField(max_length=50, null=False)
    ###

class Manager(Employee):
    department = models.CharField(max_length=50)
    ###
    here I don't want the 'name' and 'address' fields of Employee class.
    (I want other fields of Employee and department field of this class to be stored in 
    Manager table in database)
    ###

Bagaimana bisa mencapai ini. Terima kasih sebelumnya.

5
Kholdarbekov 17 Maret 2017, 17:39

2 jawaban

Jawaban Terbaik

Anda dapat membuat variabel pribadi di kelas python menggunakan 2 garis bawah (__), lihat contoh ini untuk lebih lanjut.

Namun mereka akan menyimpan nilai itu di objek anak karena tidak ada yang namanya pribadi atau dilindungi dengan Python.

Tetapi pendekatan lain dapat bekerja untuk Django. Dalam model Django bidang disimpan tergantung pada nilainya (CharField, DateField dan lain-lain) tetapi jika Anda akan membuat nilai item None atau nilai statis lainnya (mis. "string"), yang seharusnya menyelesaikan masalah Anda:

class Manager(Employee):
  name = None
  address = None
  # other_stuffs.

Dalam contoh itu, Manajer seharusnya tidak memiliki kolom nama dan alamat di database dan ketika Anda akan mencoba mengaksesnya, Anda akan mendapatkan None. Dan jika Anda ingin mendapatkan AttributeError (Django memunculkannya ketika objek tidak meminta kunci) maka Anda juga dapat menambahkan properti:

class Manager(Employee):
  name = None
  @property
  def name(self):
    raise AttributeError("'Manager' object has no attribute 'name'")
10
Community 23 Mei 2017, 12:17

Saya akan menggunakan 3 kelas:

class BaseEmployee(models.Model):
    # All your common fields

class Employee(BaseEmployee):
    name = models.CharField(max_length=50, null=False)
    address = models.CharField(max_length=50, null=False)

class Manager(BaseEmployee):
    department = models.CharField(max_length=50)

Saya pikir itu mencapai apa yang Anda inginkan.

7
foz 17 Maret 2017, 15:19