我想用sequelize正确设置一对一或一对多的关系,事实上,如果我使用hasOne
/ {{{{{{我的模型定义中有1}}或hasMany
。
例如,以下关联确实在其目标上创建了belongsTo
字段:
userId
但是在官方文档中几乎无处不在,我看到的是:
User.hasMany(Email, {
as: 'emails',
foreignKey: 'userId',
})
User.hasOne(Profile, {
as: 'profile',
foreignKey: 'userId',
})
即。 Projects.hasMany(Tasks);
Tasks.belongsTo(Projects);
和hasMany
正在一起使用。
这是真的需要还是只使用其中一个就足够了?任何进一步的解释都非常有价值。谢谢!
答案 0 :(得分:2)
使用Label
定义关联模型的所有权。为了更详细地解释这一点,我将参考教程中引用的示例
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.button import Button
from kivy.properties import ObjectProperty
from kivy.uix.image import Image
#the TextImage control
class TextImage(Button):
lbl = ObjectProperty()
img = ObjectProperty()
box = ObjectProperty()
def __init__(self, **kwargs):
super(TextImage, self).__init__(**kwargs)
#function to change specific widget position
def orient1(self):
children = self.ids.box.children[:]
self.ids.box.clear_widgets()
for child in sorted(children):
wid.add_widget(child)
.... # you can create your own funtions for arrangement
class Form(FloatLayout):
def __init__(self, **kwargs):
super(Form, self).__init__(**kwargs)
Textimg = TextImage()
Textimg.orient1() #for index arrangement
#an image
self.Img = Image(source='pic.png', size_hint=(None,None),size=(100,100))
# change the widget organization
Textimg.ids.box.orientation='vertical'
Textimg.ids.box.add_widget(self.Img)
#change your picture
Textimg.ids.img.source='myexample.png'
#Change the text
Textimg.ids.lbl.text='Picture1'
self.add_widget(Textimg)
class MainApp(App):
def build(self):
return Form()
if __name__=='__main__':
MainApp().run()
假设您不再对已删除项目的任务感兴趣。在这种情况下,如果未定义<TextImage>:
lbl: lbl
img: img
box: box
FloatLayout:
BoxLayout: # add more Image widget and change there orientation
id: box
Image:
id: img
source: 'myexample.png'
pos_hint: {'center_x':.5,'center_y':.5}
size_hint: 1,.9
Label:
id: lbl
size_hint: 1,.1
pos_hint: {'center_x':.5,'center_y':.5}
halign:'center'
关联,则必须手动删除任务。 belongsTo
通过它的任务建立项目的所有权,数据库也将自动删除属于已删除项目的任务。这称为Project.hasMany(Task);
Task.belongsTo(Project);
,可以链接多个表。
如果您运行以下代码段
belongsTo
在续集脚本中观看输出
belongsTo
你会注意到在创建任务表时设置的级联行为。
这么多说,最后的答案是:这取决于。如果您希望保留已删除项目的任务,cascading delete
的使用可能会非常方便或致命。如果在您的应用程序的上下文中有意义,则仅使用const Project = sequelize.define('project', {
name: Sequelize.STRING
});
const Task = sequelize.define('task', {
name: Sequelize.STRING
});
Project.hasMany(Task);
Task.belongsTo(Project);
。