Sequelize hasMany,belongsTo还是两者兼而有之?

时间:2017-07-29 13:18:45

标签: sql node.js postgresql sequelize.js

我想用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正在一起使用。

这是真的需要还是只使用其中一个就足够了?任何进一步的解释都非常有价值。谢谢!

1 个答案:

答案 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);