desain model Django dengan tipe pengguna yang berbeda

Saya baru belajar Django jadi saya berpikir untuk membuat proyek yang disebut papan pekerjaan untuk memahami lebih detail. Saya telah menggambar kasus penggunaan berikut.

  • Masyarakat dapat mendaftar sebagai pencari kerja, membangun profil mereka dan mencari pekerjaan yang sesuai dengan keahlian mereka
  • Perusahaan dapat mendaftar, memposting pekerjaan.
  • Beberapa perwakilan dari sebuah perusahaan harus dapat mendaftar dan memposting pekerjaan.
  • Perekrut Independen juga dapat membuat akun.
  • Perusahaan dapat menghubungi perekrut independen tersebut.

Bagaimana desain model untuk kasus penggunaan seperti itu? Saya bingung dengan banyak tipe pengguna di Django. Beberapa orang lebih suka membuat profil pengguna, sementara beberapa orang lebih suka menggunakan Grup.

Untuk saat ini, saya hanya dapat melakukan hal berikut

class User(AbstractUser):
    '''
      Abstract user because django recommends to start with custom user
    '''
    username = None
    email = models.EmailField(_("Email Address"), unique=True)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = UserManager()

    def __str__(self):
        return self.email


class Company(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)

Saya bisa membuat model untuk Pengguna dan Perusahaan. Tapi saya tidak tahu cara menangani banyak tipe pengguna seperti pengguna bisa menjadi pencari kerja atau perekrut. Selain itu, banyak perwakilan dari sebuah perusahaan harus bisa mendaftar dan memposting pekerjaan serta bisa ada perekrut independen juga. Bagaimana Anda menangani kasus seperti itu jika perlu? Adakah yang bisa membantu saya dalam panduan langkah demi langkah? Dengan cara ini kebingungan saya akan hilang dan akan membantu saya dalam mendesain tabel yang lebih baik di masa depan.

Perbarui dengan contoh singkatnya

class User(models.Model):
    '''
        User can be of any 3 types or can have multiple role as well
    '''
    is_job_seeker = models.BooleanField(default=False)
    is_recruiter = models.BooleanField(default=False)
    is_mentor = models.BooleanField(default=False)

class Company(models.Model):
    user = models.ForeignKey(User) # only user with is_recruiter flag active can be

class JobSeeker(models.Model):
    user = models.OneToOneField(User)
    # job seeker profile related fields like experiences, skills, education, profile image etc

class Recruiter(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    company = models.ForeignKey(Company, null=True, blank=True)
    # recruiter related profile 

person Surya Adhikari    schedule 09.06.2019    source sumber
comment
Ini adalah pertanyaan yang bagus tetapi juga sangat luas (bukan berarti buruk, hanya saja jawabannya akan cukup panjang). Berikut dua tautan yang tampaknya berguna dan dapat membantu mempersempit masalah: stackoverflow.com/questions/25841712/, simpleisbetterthancomplex.com/tutorial/2018/01/18/   -  person Tomasz Zieliński    schedule 09.06.2019
comment
Terima kasih banyak telah menunjukkan jalannya kepadaku. Saya ingin memeriksa apakah saya memahaminya dengan benar atau tidak. Bisakah Anda memeriksa bagian yang diperbarui untuk mencakup kasus penggunaan saya?   -  person Surya Adhikari    schedule 09.06.2019
comment
Sepertinya Anda berada di jalur yang benar. Jawaban @rydber juga bagus. Satu hal kecil yang akan saya ubah adalah saya akan mengganti bidang boolean dengan fungsi/properti yang memeriksa apakah ada objek terkait, misalnya: def is_job_seeker(self): try: user.jobseeker; except JobSeeker.DoesNotExist: return False; else: return True. Dengan cara ini konsistensi ditingkatkan karena hanya ada satu sumber kebenaran (tetapi kinerjanya lebih rendah karena ada pencarian DB; hal ini dapat diatasi dengan menggunakan properti cache yang merupakan kaleng wormnya sendiri :)). Tapi itu hanya sebuah nit.   -  person Tomasz Zieliński    schedule 10.06.2019


Jawaban (1)


Implementasi Anda hampir selesai. Sepertinya Anda tidak memerlukan model pengguna khusus sekarang, jadi saya hanya akan menggunakan default.

Saya ingin sesuatu seperti:

from django.conf import settings
from django.db import models

class Company(models.Model):
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
    )
    # Other company-related fields

class JobSeeker(models.Model):
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
    )
    # Other jobseeker-related fields

class Recruiter(models.Model):
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
    )
    company = models.ForeignKey(Company, null=True, blank=True)
    # Other recruiter-related fields

Saat Anda membuat salah satu model di atas, Anda dapat menetapkan akun pengguna kepada model tersebut; dan untuk perekrut, Anda dapat menugaskan perusahaan tempat mereka bekerja. Misalnya, perusahaan bernama stack_overflow dapat memiliki akun perusahaannya sendiri dengan nama pengguna/kata sandi/dll. Kemudian, perekrut yang bekerja untuk stack_overflow juga dapat memiliki akun sendiri dengan nama pengguna/kata sandi/dll. Menjalankan perintah seperti stackoverflow.recruiter_set akan memberi Anda semua perekrut yang bekerja untuk stack_overflow.

Perhatikan bahwa saya tidak mereferensikan User secara langsung< /a>. Menggunakan pendekatan di atas membuat hidup Anda lebih mudah jika Anda memutuskan untuk mengganti model Pengguna di masa mendatang.

Saya berasumsi Anda tidak ingin membuat User, lalu membuat Company dan menautkannya ke pengguna tersebut - Anda hanya ingin melakukannya sekaligus. Itu pertanyaan yang sedikit berbeda dan solusinya akan melibatkan Anda membuat Formulir, atau semacamnya, di mana Anda dapat menambahkan logika tentang apakah pengguna adalah perusahaan, perekrut, atau pencari kerja.

Mengenai poin Anda yang lain, sepertinya Anda ingin menyetel izin pengguna. Berikut adalah dokumen untuk mengatur izin default untuk pengguna khusus Anda, dan di sini adalah dokumen umum untuk sistem izin bawaan Django. Misalnya, model Perusahaan dan Perekrut Anda dapat menampilkan True untuk has_perm('your_app.add_job'), sedangkan model Pencari Kerja Anda menampilkan False. Yaitu. Perusahaan dan Perekrut dapat menciptakan lapangan kerja, namun pencari kerja tidak bisa.

Semoga ini membantu!

person ahmedaljawahiry    schedule 09.06.2019