我可以为Django models.ForeignKey筛选选项吗?

我可以为Django models.ForeignKey筛选选项吗?,django,django-models,Django,Django Models,我与模型、车辆和账户有很多关系,还有一个分配的关联实体,它将两个表的PKs都作为FK 现在Accounts表有一个is_driver字段,该字段采用布尔值,因为默认情况下,所有帐户都是通勤者,但有些帐户可以是司机 有没有一种方法可以将我的模型设置为只过滤Is_driver==True的帐户 我的模特 class Puv(models.Model): plate_number = models.CharField(max_length=50, unique=True) tempor

我与模型、车辆和账户有很多关系,还有一个分配的关联实体,它将两个表的PKs都作为FK

现在Accounts表有一个is_driver字段,该字段采用布尔值,因为默认情况下,所有帐户都是通勤者,但有些帐户可以是司机

有没有一种方法可以将我的模型设置为只过滤Is_driver==True的帐户

我的模特

class Puv(models.Model):
    plate_number = models.CharField(max_length=50, unique=True)
    temporary_plate = models.BooleanField(default=True) 
    route = models.ForeignKey(Route, on_delete=models.CASCADE, blank=True, null=True)

class Assignment(models.Model):
    driver = models.ForeignKey(User, on_delete=models.CASCADE)
    puv = models.ForeignKey(Puv, on_delete=models.CASCADE)
    assignment_date = models.DateField(auto_now_add=True)
用户在单独的应用程序中建模

class User(AbstractBaseUser, PermissionsMixin):
    ....
    is_driver = models.BooleanField(default=False)
您可以使用:

课堂作业(models.Model):
driver=models.ForeignKey(
用户,
在_delete=models.CASCADE上,
将_选项_限制为={'is_driver':True}
)
puv=models.ForeignKey(puv,on_delete=models.CASCADE)
分配\日期=模型.日期字段(自动\现在\添加=真)
这不会由数据库强制执行,但将由
ModelForm
ModelAdmin
进行检查


注意:通常最好使用来引用用户模型,而不是直接使用。有关更多信息,请参见


请分享你的模型。我已经编辑了这篇文章并包括了模型:)工作得很神奇!非常感谢。我可以有多个条件限制您的选择吗?例如,将其限制为未分配的驱动程序?当然,在添加一个字段后,它会被分配给我的用户模型。@Allen:您可以使用
将选项限制为={'is\u driver':True,'is\u assigned':False}
,但您不需要为其创建额外的字段。您可以在
赋值中使用联接,因此:
将选项限制到={'is\u driver':True,'Assignment':None}
。哇!非常感谢你!但我认为仍然需要“分配”字段,因为稍后可以取消分配驱动程序,但分配记录应该保留下来,以便记录。@Allen:不,通常不会,加入将自动确定是否分配了驱动程序。这也更加可靠,因为如果您稍后取消对驾驶员的分配,或者车辆被移走,它将重新可用。我在这里有点困惑。当您重新分配驾驶员或车辆时,是否会出现重复?还是Django有办法绕过它?对不起,我是Django的新手,在我看来,我只需将is_assigned设置为False,然后驾驶员或车辆就可以再次进行分配。你能给我介绍一下吗?还是我应该再发一个问题?谢谢
class Assignment(models.Model):
    driver = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        limit_choices_to={'is_driver': True}
    )
    puv = models.ForeignKey(Puv, on_delete=models.CASCADE)
    assignment_date = models.DateField(auto_now_add=True)