链接外键

时间:2012-08-11 22:00:11

标签: django django-models django-admin foreign-keys

我有几个看起来像这样的模型:

class System(models.Model):
    '''Defines a system'''
    system_desc = models.CharField('System Name', max_length=50)

class SystemGroup(models.Model):
    '''Groups within a 'System' (ie. Customers, regions, divisions, etc. '''
    group_desc = models.CharField('Group Name',max_length=25)
    system = models.ForeignKey(System)

class QueryData(models.Model):
    '''Queries related to a 'System' (ie. Active users against System1, Orders today in system2, etc. '''
    qry_desc = models.CharField('Query Description', max_length=50)
    system = models.ForeignKey(System)

class UserDashboard(models.Model):
    '''User specific Dashboard '''
    user = models.ForeignKey(User)
    board_name = models.CharField('Dashboard Name', max_length=50)

class UserDashboardGroup(models.Model):
    '''Groups on the dashboard (ie. 'System 1's Key Indicators', 'System 2's Hot Sheet', etc. '''
    group_desc = models.CharField('Group Display Title', max_length=50)
    user = models.ForeignKey(User)
    dashboard = models.ForeignKey(UserDashboard)
    system = models.ForeignKey(System)
    system_group = models.ForeignKey(SystemGroup)

class UserGroupQuery(models.Model):
    '''Queries that run in a specific group on the dashboard (ie. Within 'System 1's Key Indicators, we run queries for active users today, orders in the last hour, etc. '''
    user = models.ForeignKey(User)
    dashboard = ChainedForeignKey(UserDashboard, chained_field='user', chained_model_field='user', show_all=False, auto_choose=True)
    user_dashboard_group = ChainedForeignKey(UserDashboardGroup, chained_field='dashboard', chained_model_field='dashboard')
    query = models.ForeignKey(QueryData)

我在最后一部分遇到了问题。我想限制查询'显示在基于所选user_dashboard_group的管理页面中。根据我目前的型号,我不确定如何做到这一点。 queryuser_dashboard_group都有System的外键,但彼此没有。要做到这一点,我必须得到user_dashboard_group' system,然后使用它来过滤QueryData。我怎么能这样做?

修改 我在图片中加入(希望)描述我想做的更好一点。 在步骤1中,用户输入该组查询的名称。该组与系统(#2)和系统内的预定义组(#3)相关联(将#3视为'客户'或'区域'等等尽管命名相似,但#1和#3并不是一回事。然后,他们选择“保存并继续编辑”'在此内联表单中,步骤4中的下拉列表将填充上述表单中的信息。一旦步骤#4进行了选择,我希望#5仅使用来自关联系统的数据填充。由于#2包含这些信息,我希望这样做很容易,但我无法弄清楚链接。

Demo dashboard

我也意识到我没有提到我正在使用django-smart-selects

2 个答案:

答案 0 :(得分:2)

我从未使用过django-smart-choices,但遵循文档,我希望

query = models.ChainedForeignKey(QueryData,**kwargs)

而不是

query = models.ForeignKey(QueryData)

因为您希望查询中的选项取决于其他选择。这种理解是否正确?如果是这样,那只是关于定义正确的** kwargs。

对于** kwargs,我会建议像这样的

<强>更新

chained_field='query', chained_model_field='user_dashboard_group__system__query_set__query'

假设在两种情况下字段名称都是'system。 我很确定这正确地描述了这种关系。我只是不确定,如果django-smart-choices支持这种语法。

答案 1 :(得分:0)

除了两个关系之外,你会在一个关系中做到这一点。

field__relation1__relation2