2014-11-25 72 views
0

我以某种模式创建了一组模型,以便某些模型可以包含来自多个父类的详细信息。我的项目需要我有这些主要类别:Django:具有多个行内表的父表使用外键从父项链接到每个行内表

-- {class name} {file name they are contained in} 
-- Attraction (attraction.py) 
-- Tours (tours.py) 
-- Transit (transit.py) 
-- Flight (flight.py) 
-- Accomodation (accomodation.py) 

他们每个人都有多个公共领域,其建模成普通机型;我想有从班外键上方到下方的那些:

-- Contact (contact.py) 
-- Address (address.py) 
-- LocationMetadata (location.py) 
-- Duration (duration.py) 
-- Price (price.py) 

我从

attraction --> contact, address, location, price 

transit --> location, price 

accomodation --> location, type, price, contact, address 

范例模型Atraction取得外键:

class Attraction(models.Model): 
    ... 

    ATTRACTION_TYPE = (
     ('NIGHT-LIFE', 'NL'), 
     ('EARTERY', 'EAT'), 
     ('CULTURAL', 'CUL'), 
     ('LANDMARK', 'LNDMRK'), 
     ('ADVENTURE', 'ADV'), 
     ('ENTERTAINMENT', 'ENT'), 
     ('SCENIC', 'SNC'), 
     ('WILDLIFE', 'WDL') 
    ) 

    type = forms.MultipleChoiceField(choices=ATTRACTION_TYPE) 
    ... 

我想创建管理员访问权限(吸引力,过境,住宿)作为接入点和休息,以便与他们联系。但是这在Django中是不允许的...有没有办法绕过它?

+0

张贴您的模特。没有他们很难提供帮助。 – 2014-11-25 11:38:33

回答

1

这证明是我需要做的最好的解决方案。

https://pypi.python.org/pypi/django-multiselectfield 

它在模型本身内部提供了一个多选字段;并将所有选定的条目添加为csv。

1

(评论后可进行编辑。)

这听起来像你想使用InlineModelAdmins,而是由ForeignKey的链接到模型。

您需要做的第一件事是将ForeignKey字段更改为OneToOneFields。这是必要的,因为否则你可能会有,例如,出现在多个吸引力表单上的相同的地址模型实例。从外观上看,OneToOneField无论如何都是这个用例的更好的数据库结构。

您需要做的第二件事是重写管理员,以便它允许另一个模型上的OneToOneField。我没有使用它,但this snippet看起来像它会做的伎俩。

+0

如果我们用这种方式对它进行建模,那么它会弹出一个错误信息,因为django要求从位置到外部的所有其他外键... – phoenix 2014-11-25 15:38:44

+0

如果您将ForeignKey字段移动到您想要的模型以内联方式显示。所以你在Address模型上有一个吸引域,而不是在Attraction模型上的地址域。这是一个选择吗? – seddonym 2014-11-25 15:49:01

+0

这是很好的...这就是我想要实现的...但是,然后我不能让外键(接触,位置等)到所有其他(吸引力,旅游,住宿等)。即使我这样做......我的模型会有循环导入(Python不支持),或两种方式的外键。这对我没有意义。 – phoenix 2014-11-25 16:18:19

相关问题