2015-04-23 3 views
-1
  • Я пытаюсь построить отношения «один ко многим» между таблицей Проекта и таблицей отчетов.
  • Пользователь может создать новый проект, позже он может создать один или несколько новых отчетов, связанных с этим проектом.
  • Эти две таблицы будут использоваться для отчетности. Например, если я создаю новое приложение, я создам новый проект с именем моего приложения. Затем, когда я тестирую свое приложение на определенном устройстве, таком как ПК или iPhone, и я столкнулся с проблемой, я создам новый отчет об этой проблеме.

class Project(db.Model): 
    project_id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String) 
    date = db.Column(db.Date) 

    def __init__(self, name, date): 
     self.name = name 
     self.date = date 

    def __repr__(self): 
     return self.name 

class Report(db.Model): 
    report_id = db.Column(db.Integer, primary_key=True) 
    project_id = db.Column(db.Integer, db.ForeignKey('project.project_id')) 
    project = db.relationship('Report', backref='reports', lazy='dynamic') 
    date = db.Column(db.Date) 
    issue = db.Column(db.Text) 

    def __init__(self, project_id, date, issue): 
     self.project_id = project_id 
     self.date = date 
     self.issue = issue 

    def __repr__(self): 
     return self.issue 

Вопросы:Отношение к ко многим SQL

  1. связь между двумя таблицами правильно, как один ко многим отношений?

  2. Есть init Функция действительно требуется здесь? Я видел код онлайн без них!

Большое спасибо

ответ

0

Flask-SQLAlchemy's documentation обложки, создающие отношения «один ко многим». Он представляет собой пример одного Person, имеющего много Address es.

class Person(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(50)) 
    addresses = db.relationship('Address', backref='person', 
           lazy='dynamic') 

class Address(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    email = db.Column(db.String(50)) 
    person_id = db.Column(db.Integer, db.ForeignKey('person.id')) 

Это соответствует тому, что у вас есть. Единственное различие заключается в том, что пример помещает отношения в родительскую модель. Он может быть помещен на любую модель. Я стараюсь всегда размещать его на том, где он имеет наибольший смысл.

Что касается ваших методов __init__, они, скорее всего, не нужны. Класс Model класса Flask-SQLAlchemy содержит __init__, который принимает аргументы ключевых слов, которые позволяют присваивать значения столбцам. Разница в том, что ваши версии требуют указанных полей, тогда как версия по умолчанию не требует никаких.

Ваша версия работает только как

project = Project('My Project', date(2015, 4, 23)) 

Model «s версия не только работает точно так же, но он также работает как

project = Project() 
project.name = 'My Project' 
project.date = date(2015, 4, 23) 
+0

Вы Awesome @dirn. > Единственное различие заключается в том, что пример связывает отношения с родительской моделью. Он может быть помещен на любую модель. Это действительно объясняет это! Я видел этот пример персонального адреса, когда я искал, но потом я видел другие примеры для многих отношений, и они различаются в линии отношений, вот почему меня путают. Спасибо – Aseel

0

INIT функция есть, так что вы, что при создании экземпляра класса, вы можете установить исходные значения или выполнять функции инициализации. Если вы считаете, что вам не нужно делать такие вещи, вы можете опустить определение init.

+0

> Если вы чувствуете, что вам не нужно делать такие вещи , вы можете опустить определение init. Спасибо, Рон, что помогло – Aseel