如果其中一个在每种情况下都为NULL,如何避免django模型中的两个ForeignKeys

时间:2016-08-09 13:29:22

标签: sql django

序幕:

我的模特叫做:

  • 主管
  • 推销员
  • 汽车
  • 摩托车
  • 产品(汽车和摩托车的抽象模型)

销售员和主管可以销售汽车。主管还控制两个或更多销售人员的工作。

我该怎么做: 我想为这项任务创造最适合的模型。

问题: 问题是主管可以控制销售人员和销售产品。我想创建一个名为'Staff'的抽象模型,它将是SalesmanSupervisor之间的共享字段,ProductForeignKeyStaff。但我无法将ForeignKey变为抽象模型 我不想让Product作为一个表来判断推销员字段或主管字段是否为空。而且我不想使用通用ForeignKey,因为它很复杂。

我最好的猜测:例如,添加John Smith作为主管和推销员。在这种情况下,约翰史密斯的销售员将约翰史密斯的ForeignKey作为主管。但我认为有最好的解决方案。

最简单但最糟糕的决定。

class Product(models.Model):
  company = models.ForeignKey(Company, verbose_name = 'Car company');
  price = models.IntegerField()
  horse_power = models.IntegerField()
  salesman = models.ForeignKey(Salesman, null=True)
  supervisor = models.ForeignKey(Supervisor, null=True)

  class Meta:
    abstract = True

class Car(Product):
  number_of_doors = models.IntegerField()
  is_conditioner = models.NullBooleanField()

class Supervisor(models.Model):
  name = models.CharField(max_length=100)

class Salesman(models.Model):
  name = models.ChartField(max_length=100)
  supervisor = models.ForeignKey(Supervisor)

我的问题是重写模型结构的最佳方法是什么,以避免两个ForeignKeys,如果其中一个在每种情况下都为NULL并避免ForeignKey抽象模型。

1 个答案:

答案 0 :(得分:1)

我认为一个简单的解决方案是将SupervisorSalesman合并到一个模型中。您可以简单地调用此Staff并创建一个名为is_supervisor的字段,以区分主管和常规销售人员。

为此,您可以将模型设置为:

class Product(models.Model):
  staff = models.ForeignKey(Staff, null=True)
  # other stuff

class Staff(models.Model):
  name = models.CharField(max_length=100)
  supervisor = models.ForeignKey('self', null=True)
  is_supervisor = models.BooleanField()