2017-03-02 169 views
0

我正在python中使用django框架構建一個web應用程序。在我的應用程序中,用戶需要能夠申請工作。如何創建Django模型字段來存儲與模型相關的用戶?

我不確定如何將已在作業模型中申請作業的用戶列表保存爲字段。

這裏是我的Job.py型號:

class Job(models.Model): 
    user = models.ForeignKey(User, related_name="jobs") 
    created_at = models.DateTimeField(auto_now_add=True) 
    title = models.CharField(max_length=30) 
    description = models.TextField() 
    pay = models.FloatField() 
    category = models.CharField(max_length=3, choices=JOB_CATEGORY_CHOICES) 
    #applicants = 

    def __str__(self): 
     return self.title 

    def get_absolute_url(self): 
     return reverse('jobs:detail', kwargs={ 
      'job_pk': self.id 
      } 
     ) 

我需要申請人字段(這是目前註釋掉)存儲誰已經申請了這份工作的用戶。我該怎麼做呢?

回答

1

如果我正確理解你的問題,我想你會需要你的模型設置是這樣的:

class Job(models.Model): 
    created_at = models.DateTimeField(auto_now_add=True) 
    title = models.CharField(max_length=30) 
    description = models.TextField() 
    pay = models.FloatField() 
    category = models.CharField(max_length=3, choices=JOB_CATEGORY_CHOICES) 

    def __str__(self): 
     return self.title 

    def get_absolute_url(self): 
     return reverse('jobs:detail', kwargs={ 
      'job_pk': self.id 
      } 
     ) 

class Applicant(models.Model): 
    job = models.ForeignKey(Job, related_name="applicants") 
    user = models.ForeignKey(User) 

。這將創建JobApplicant一到一個一對多的關係,然後多種關係從ApplicantUser

+0

爲什麼'用戶'上的OneToOne字段?這將阻止用戶應用於多個工作。 –

+0

不,在這種情況下,您會創建另一個「申請人」對象。它意味着每個「申請人」對象只有一個用戶。 – themanatuf

+0

用戶上的ForeignKey已經意味着「每個申請人只有一個用戶」 - 否則你需要一個ManyToManyField--而OneToOne字段的確可以爲同一用戶創建許多申請人(事實上,對我來說這實在是太驚奇了,我以爲Django會防止這種情況,並且IIRC it_did_阻止它),它至少會阻止通過user.applicant_set.all()從用戶那裏獲得應用程序。 OneToOne字段主要是爲了表達一種「是」的關係,而不是「有」。 –

0

正如themanatuf所說,其他具有外鍵和一對一關係的模型可以做到這一點。

我建議你首先做Django 101 polls tutorial--它很好解釋,並且有非常類似的相關模型架構。

玩得開心!

1

假設一個用戶可以應用到很多工作,工作可以有很多的用戶應用,簡單的解決方案是一個多對多的關係,由ManyToManyField定義:

class Job(models.Model): 
    users = models.ManyToManyField(User) 

現在你可能會想跟蹤關於應用程序的其他信息(日期等),在這種情況下,明確的中間模型可能會得心應手:

class Application(models.Model): 
    job = models.ForeignKey(Job) 
    user = models.ForeignKey(User) 
    date ⁼ models.DateTimeField(...) 
    # etc 

    class Meta: 
     # you probably don't want the same user 
     # to apply twice to the same job 
     unique_together = [("job", "user"),] 
+0

我不明白您的答案中的代碼的第一部分是什麼以及什麼其目的是。你能詳細說明一下嗎? @bruno desthuilliers –

+0

第一個片段是如何在兩個模型之間建立簡單(非值)多對多關係的示例。第二個片段是如何通過中間模型手動創建多對多關係的示例。你必須實際選擇一個或另一個。 –

+0

好的,現在感謝得多了。 –

相關問題