我使用peewee创建了一个小的sqlite3数据库,试图理解外键并让它们在一个简单的数据库中工作。
from peewee import *
db = SqliteDatabase('database.db')
class Category(Model):
category = CharField()
class Meta:
database = db
class Subcat(Model):
description = BlobField()
sub_cat = CharField()
top_category = ForeignKeyField(Category, related_name='group')
class Meta:
database = db
db.connect()
db.create_tables([Category, Subcat], safe=True)
然后我创建了一个controller.py文件来处理所有数据库事务。 (更新) 来自peewee进口* 来自数据库导入*
class ModCat(Category):
def add_cat(self,category):
update = Category.create(category=category)
def get_cat(self):
categories = Category.select(Category.category).order_by(Category.category)
return categories
class ModSubCat(Subcat):
def save_sub_cat(self, sub, master, desc):
name = Category().select().where(Category.name==master)
update = Subcat.create(sub_cat=sub, top_category=name, description=desc)
最后,main.py允许我使用在wxFormBuilder中创建的简单表单将数据输入数据库。
from gui import *
from controller import *
class Menu(InDb):
def __init__(self, parent):
InDb.__init__(self, parent)
get_categories = ModCat()
list = get_categories.get_cat()
new_list = []
for thing in list:
new_list.append(thing.category)
print new_list
for f in new_list:
self.m_comboBox1.Append(f)
def click_save( self, event ):
new_cat = ModCat()
new_cat.add_cat(self.m_textCtrl3.GetValue())
self.GetParent() # This assigns parent frame to frame.
self.Close() # This then closes frame removing the main menu.
frame = Menu(None)
frame.Centre()
frame.Show()
def sub_save( self, event ):
sub = self.m_textCtrl5.GetValue()
master = self.m_comboBox1.GetValue()
desc = "Hi"
update = ModSubCat()
update.save_sub_cat(sub, master, desc)
#Start App by calling sub class of MainMenu
if __name__ == '__main__':
app = wx.App(0)
frame = Menu(None)
frame.Centre()
frame.Show()
app.MainLoop()
数据库创建时没有错误,但是当我运行main.py时,它总是返回此错误。
Traceback (most recent call last):
File "C:/Users/********/PycharmProjects/RAMS/main.py", line 2, in <module>
from controller import *
File "C:\Users\********\PycharmProjects\RAMS\controller.py", line 13, in <module>
class ModSubCat(Subcat):
File "C:\Python27\lib\site-packages\peewee.py", line 4710, in __new__
field.add_to_class(cls, name)
File "C:\Python27\lib\site-packages\peewee.py", line 1437, in add_to_class
invalid('The related_name of %(field)s ("%(backref)s") '
File "C:\Python27\lib\site-packages\peewee.py", line 1431, in invalid
raise AttributeError(msg % context)
AttributeError: The related_name of modsubcat.top_category ("group") is already in use by another foreign key.
我没有运气改变了related_by值。 事实上我在controller.py中有一个Sub Class ModSubCat会导致问题吗?
我已删除related_name='group'
这
top_category = ForeignKeyField(Category, related_name='group')
现在一切正常。
相关的名称是什么?