为Django建模ER图

时间:2019-01-24 14:24:17

标签: django composite-primary-key


我需要一些帮助,以使用Django的Admin接口,两个实体(Item,Prototype)将其转换为表格,然后转换为Django的模型,其中:

  • 项目可以是独立对象,也可以是一个原型的一部分
  • 原型仅在至少包含一个项目时存在
  • 原型可以包含许多不同项。

ER图应为:
enter image description here

在Django方面,我希望:从PrototypeAdmin中包含所有项,并从ItemAdmin中将其分配给一个原型,如下图所示:
addChangeItem addChangePrototype

我做了一些尝试来设计不同的模型,但是我对结果并不完全满意(一次尝试暗示了许多NULL,另一次给出了一个不太容易使用的管理界面,另一次我只能将Items添加到原型。 )

编辑:
我的第一个尝试是设计一个带有两个主键的Prototype表,但是我发现Django不能很好地使用它们,而且ItemAdmin内部没有任何小部件可以将Item分配给原型:


    Items: (ItemID, itemName)
    Prototypes:(PrototypeID,ItemID,prototypeName)

另一种尝试给出了具有95%的NULL FK的Items表(我们只有几个原型!),我还需要保证prototypeID-ItemID的唯一性,但这对我想要的GUI很有帮助(前两个)图片):


   Items: (ItemID, itemName, prototype(FK))
   Prototypes:(PrototypeID,prototypeName)

另一种尝试解决了成千上万个NULL的问题,但是在Django方面,虽然我可以通过TabularInline向原型添加很多项目,但我不喜欢使用另一个TabularInline选择要分配给项目的原型(我希望有一个下拉列表):


    Items: (ItemID, itemName, prototype(FK))
    Prototypes:(PrototypeID,prototypeName)
    linkTableProtoItems: (lnk_ID, prototype(FK), item(FK))

2 个答案:

答案 0 :(得分:1)

给出您的规格,即:

  

Item可以是独立对象,也可以只是一个原型的一部分   原型仅在包含至少一个Item时存在   原型可以包含许多不同的项目。

最近的模式是您的第二个模式:

  

物品:(物品ID,物品名称,原型(FK))

     

原型:(PrototypeID,prototypeName)

其他无效:第一个不尊重“一个原型可以包含许多不同的项目”,而第三个不尊重“一个项目只能是一个原型的一部分”。

import React, { Component } from 'react'; import { createMaterialBottomTabNavigator } from 'react-navigation-material-bottom-tabs'; import LoginScreen from '../screens/Login'; import HomeScreen from '../screens/Homescreen' import Icon from 'react-native-vector-icons/Ionicons'; import App from '../../App'; export default Navigator = () => createMaterialBottomTabNavigator( { LoginScreen: { screen: LoginScreen, navigationOptions: { tabBarLabel: 'Login', tabBarIcon: ({ tintColor, focused }) => ( <Icon size={23} name={(focused ? 'ios-home' : 'ios-home-outline')} style={{ color: tintColor }} /> ), } }, Home: { screen: HomeScreen, navigationOptions: { tabBarLabel: 'Home', tabBarIcon: ({ tintColor, focused }) => ( <Icon size={23} name={(focused ? 'ios-stats' : 'ios-stats-outline')} style={{ color: tintColor }} /> ) } }, }, { shifting: false, backBehavior: "initialRoute", initialRouteName: "LoginScreen", activeColor: 'white', tabBarColor: 'blue', inactiveTintColor: 'black', barStyle: { backgroundColor: 'orange'}, swipeEnabled: true, } ); 中95%或以上为null的事实无论如何都不是问题。

答案 1 :(得分:0)

商品:(商品ID,商品名称)

原型:(PrototypeID,ItemID,prototypeName)

在Items关系中,ItemID必须是主键,而在Protorypes关系中,PrototypeID必须是主键。但是Prototypes关系中的ItemID将是引用Items关系的外键。