2013-10-15 100 views
0

尋找建立此模型的建議。Django模型 - 建立「has_many_through」關係

這個工作板應用程序有公司,位置和工作。他們應該有以下關係:

  • ,公司可以有多個位置
  • ,公司可以有多個作業
  • 一個作業只能有一個公司
  • 作業可以具有多個位置,但每地點必須是有效的工作的公司

我想創建一個模型,反映這些關係。我覺得這樣的事情可能工作:

class Company(models.Model): 
    name = models.CharField(max_length=200) 
    description = models.TextField() 

class Location(models.Model): 
    is_primary_location = models.BooleanField() 
    address = models.CharField(max_length=200) 
    company = models.ForeignKey(Company) 

class Job(models.Model): 
    title = models.CharField(max_length=200) 
    company = models.ForeignKey(Company) 
    location = models.ForeignKey(Location) 

但我真的很喜歡「招聘具有位置(一個或多個)通過公司」關係被強制執行。該模型沒有強制執行;我想我必須在數據顯示時過濾有效的位置,我想避免這種情況。

非常感謝!

回答

0

看看ForeignKey.limit_choices_to

這允許您過濾可用選項,並在ModelForm中執行。由於您已在Job模型中擁有公司外鍵,因此您應該可以使用它來過濾選擇。

0

我結束了使用https://github.com/digi604/django-smart-selects並寫了這樣的模型。我不認爲limit_choices_to在這種情況下工作(根據其他SO線程)

from smart_selects.db_fields import ChainedForeignKey 

class Company(models.Model): 
    name = models.CharField(max_length=200) 
    description = models.TextField() 

class Location(models.Model): 
    is_primary_location = models.BooleanField() 
    address = models.CharField(max_length=200) 
    company = models.ForeignKey(Company) 

class Job(models.Model): 
    title = models.CharField(max_length=200) 
    company = models.ForeignKey(Company) 
    location = ChainedForeignKey(
     Location, 
     chained_field="company", 
     chained_model_field="company", 
     show_all=False, 
     auto_choose=True 
    ) 
+0

我結束了不使用智能選擇,而是隻是增加了一個驗證規則時,作業保存:'如果(self.company_id! = Location.objects.get(pk = self.location_id).company_id): raise ValidationError('Location is not valid for company')' – billrichards