การออกแบบโมเดล django พร้อมผู้ใช้ประเภทต่างๆ

ฉันเพิ่งเรียนรู้ Django ดังนั้นฉันจึงคิดที่จะสร้างโปรเจ็กต์ที่เรียกว่า job board เพื่อทำความเข้าใจในรายละเอียดมากขึ้น ฉันได้วาดกรณีการใช้งานต่อไปนี้

  • ผู้คนสามารถลงทะเบียนเป็นผู้หางาน สร้างโปรไฟล์ และหางานที่ตรงกับทักษะของตนเอง
  • บริษัทสามารถลงทะเบียน ลงประกาศงานได้
  • ตัวแทนหลายคนจากบริษัทหนึ่งควรจะสามารถลงทะเบียนและลงประกาศงานได้
  • ผู้สรรหาอิสระสามารถสร้างบัญชีได้เช่นกัน
  • บริษัทสามารถติดต่อกับผู้สรรหาอิสระรายนั้นได้

การออกแบบโมเดลสำหรับกรณีการใช้งานดังกล่าวจะเป็นอย่างไร ฉันสับสนกับผู้ใช้หลายประเภทใน Django ข้อดีบางประการในการสร้างโปรไฟล์ผู้ใช้ ในขณะที่ข้อดีบางประการในการใช้ Groups

สำหรับตอนนี้ฉันทำได้เพียงสิ่งต่อไปนี้เท่านั้น

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)

ฉันสามารถสร้างแบบจำลองสำหรับผู้ใช้และบริษัทได้ แต่ฉันไม่รู้ว่าจะจัดการกับผู้ใช้หลายประเภท เช่น ผู้ใช้สามารถเป็นผู้หางานหรือผู้สรรหาก็ได้ นอกจากนี้ ตัวแทนหลายคนจากบริษัทหนึ่งควรจะสามารถลงทะเบียนและลงประกาศงานได้ รวมทั้งสามารถมีผู้สรรหาอิสระได้เช่นกัน คุณจะจัดการกับกรณีดังกล่าวอย่างไรหากจำเป็น? ใครสามารถช่วยฉันในคำแนะนำทีละขั้นตอนโปรด? วิธีนี้จะช่วยขจัดความสับสนของฉันและจะช่วยฉันในการออกแบบตารางได้ดีขึ้นในอนาคต

อัปเดตพร้อมตัวอย่างโดยสรุป

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 แหล่งที่มา
comment
นี่เป็นคำถามที่ดีแต่ก็กว้างมากเช่นกัน (ไม่ใช่ว่าไม่ดี แค่คำตอบคงจะยาวพอสมควร) ต่อไปนี้เป็นลิงก์สองลิงก์ที่ดูมีประโยชน์และสามารถช่วยในการจำกัดปัญหาให้แคบลง: stackoverflow.com/questions/25841712/, simpleisbetterthancomplex.com/tutorial/2018/01/18/   -  person Tomasz Zieliński    schedule 09.06.2019
comment
ขอบคุณมากครับที่ชี้ทางให้ผม ฉันต้องการตรวจสอบว่าฉันเข้าใจถูกต้องหรือไม่ คุณสามารถตรวจสอบส่วนที่อัปเดตเพื่อครอบคลุมกรณีการใช้งานของฉันได้ไหม   -  person Surya Adhikari    schedule 09.06.2019
comment
ดูเหมือนว่าคุณมาถูกทางแล้ว คำตอบของ @rydber ก็ดีเช่นกัน สิ่งเล็กๆ น้อยๆ อย่างหนึ่งที่ฉันจะเปลี่ยนคือแทนที่ฟิลด์บูลีนด้วยฟังก์ชัน/คุณสมบัติตรวจสอบว่ามีวัตถุที่เกี่ยวข้องอยู่หรือไม่ เช่น: def is_job_seeker(self): try: user.jobseeker; except JobSeeker.DoesNotExist: return False; else: return True วิธีนี้ได้รับการปรับปรุงความสอดคล้องเนื่องจากมีแหล่งความจริงแหล่งเดียว (แต่ประสิทธิภาพจะลดลงเมื่อมีการค้นหาฐานข้อมูล ซึ่งสามารถแก้ไขได้โดยใช้คุณสมบัติแคชซึ่งเป็นเวิร์มกระป๋องของตัวเอง :)) แต่มันก็เป็นแค่เรื่องไร้สาระ   -  person Tomasz Zieliński    schedule 10.06.2019


คำตอบ (1)


การใช้งานของคุณใกล้จะเสร็จสิ้นแล้ว ดูเหมือนว่าคุณไม่จำเป็นต้องมี โมเดลผู้ใช้ที่กำหนดเอง ตอนนี้ ดังนั้นฉันจะใช้ ค่าเริ่มต้น

ฉันจะมีบางอย่างเช่น:

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

เมื่อคุณสร้างโมเดลใดๆ ข้างต้น คุณสามารถกำหนดบัญชีผู้ใช้ให้กับพวกเขาได้ และสำหรับผู้สรรหาบุคลากร คุณสามารถมอบหมายบริษัทที่พวกเขาทำงานให้ได้ ตัวอย่างเช่น บริษัทชื่อ stack_overflow สามารถมีบัญชีบริษัทของตนเองพร้อมชื่อผู้ใช้/รหัสผ่าน/อื่นๆ ได้ จากนั้น ผู้สรรหาที่ทำงานให้กับ stack_overflow ก็สามารถมีบัญชีของตนเองโดยใช้ชื่อผู้ใช้/รหัสผ่าน/อื่นๆ ของตนเองได้ การรันคำสั่งเช่น stackoverflow.recruiter_set จะทำให้คุณได้รับผู้สรรหาทุกคนที่ทำงานให้กับ stack_overflow

โปรดทราบว่าฉัน ไม่ได้อ้างอิง User โดยตรง< /ก>. การใช้แนวทางข้างต้นจะทำให้ชีวิตของคุณง่ายขึ้นหากคุณตัดสินใจเปลี่ยนรุ่นผู้ใช้ในอนาคต

ฉันสมมติว่าคุณไม่ต้องการสร้าง User จากนั้นสร้าง Company และเชื่อมโยงกับผู้ใช้นั้น - คุณเพียงแค่ต้องการทำในครั้งเดียว นั่นเป็นคำถามที่แตกต่างออกไปเล็กน้อย และวิธีแก้ปัญหาจะให้คุณสร้างแบบฟอร์มลงทะเบียน หรืออะไรทำนองนั้น โดยคุณสามารถเพิ่มตรรกะได้ว่าผู้ใช้นั้นเป็นบริษัท ผู้จัดหางาน หรือคนหางานหรือไม่

สำหรับประเด็นอื่นๆ ของคุณ ดูเหมือนว่าคุณต้องการตั้งค่าการอนุญาตของผู้ใช้ ที่นี่คือเอกสารสำหรับ การตั้งค่าการอนุญาตเริ่มต้นสำหรับผู้ใช้ที่คุณกำหนดเอง และ ที่นี่เป็นเอกสารทั่วไปสำหรับระบบสิทธิ์ในตัวของ Django ตัวอย่างเช่น โมเดลบริษัทและผู้สรรหาอาจส่งคืน True ในราคา has_perm('your_app.add_job') ในขณะที่โมเดลผู้หางานของคุณส่งคืน False เช่น. บริษัทและนายหน้าสามารถสร้างงานได้ แต่ผู้หางานทำไม่ได้

หวังว่านี่จะช่วยได้!

person ahmedaljawahiry    schedule 09.06.2019