【发布时间】:2015-05-29 15:54:47
【问题描述】:
我不确定用正确的术语来解释我需要什么,我认为最简单的方法是举例说明。
我有以下模型 - 公司和软件资产。
class Company(models.Model):
name = models.CharField(max_length=200)
class SoftwareAsset(models.Model):
name = models.CharField(max_length=200)
然后,我想将各种公司映射到他们拥有的软件资产。例如,大多数公司可能拥有“Microsoft Office”资产,但只有少数公司可能拥有“Adobe Photoshop”。我为此使用了一个连接表(同样,我不确定这是否是正确的术语,或者更重要的是,这是否是正确的处理方式)。
class CompanyAssets(models.Model):
company = models.ForeignKey(Company)
asset = models.ForeignKey(SoftwareAsset)
然后我需要定义员工以及他们受雇的公司:
class Employee(models.Model):
name = models.CharField(max_length=200)
company = models.ForeignKey(Company)
最后,我需要定义每个员工可以访问哪些应用程序:
class EmployeeSoftware(models.Model):
employee = models.ForeignKey(Employee)
asset = models.ForeignKey(SoftwareAsset)
现在,所有这些都可以正常工作,只有一个例外。当我在管理界面中并将记录添加到 EmployeeSoftware 表时,我可以选择公司不拥有的 SoftwareAssets。 SoftwareAsset 下拉列表允许我选择 SoftwareAsset 表中定义的任何软件包。我想将此限制为公司拥有的资产,如 CompanyAssets 中所定义。
我的偏好是在模型中执行此操作 - 如果可以防止在数据库级别为员工分配公司不拥有的资产,但从我所做的阅读来看,这是不可能的。我搞砸了 ForeignKey.limit_choices_to 论点,但运气不佳。
我尝试使用 formfield_for_foreignkey 为 EmployeeSoftwareAdmin 类编辑 admin.py:
class EmployeeSoftwareAdmin(admin.ModelAdmin):
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == 'asset':
kwargs['queryset'] = CompanyAssets.objects.filter(company__name="XXXXX") #works but is obviously static
return super(EmployeeSoftwareAdmin,self).formfield_for_foreignkey(db_field,request,**kwargs)
我无法找到一种方法来访问 formfield_for_foreignkey 方法中的任何对象,以允许进行正确的过滤。
【问题讨论】:
-
非常相似(重复?)问题here。
-
我确实看到了,但无法应用它,而且场景与我的有些不同,因为他有 2 个类,我需要根据第 3 个类进行过滤。
标签: python django foreign-keys