Django模型 - 建立“has_many_through”关系

时间:2013-10-15 15:03:32

标签: django django-models

寻找有关设置此模型的建议。

此工作板应用程序包含公司,位置和工作。他们应该有以下关系:

  • 公司可以有多个地点
  • 公司可以有多个工作
  • 工作只能有一个公司
  • 作业可以有多个位置,但每个位置必须对作业的公司有效

我想创建一个反映这些关系的模型。我觉得这样的事情可能有用:

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)

但我真的希望强制执行“Job has Location(s)through Company”的关系。该模型不强制执行;我想在显示数据时我必须过滤有效的位置,我想避免这种情况。

非常感谢!

2 个答案:

答案 0 :(得分:0)

看看ForeignKey.limit_choices_to

这允许您过滤可用的选项,并在ModelForm中强制执行。由于您已在工作模型中拥有公司外键,因此您应该可以使用它来过滤选项。

答案 1 :(得分: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
    )