Как установить уникальные мультиколонки в web2py
Чтобы сделать связь между многими и многими, я создаю промежуточную таблицу для объединения двух таблиц, таких таблиц:
db.define_table('problem',
Field('task_id','reference task'),
Field('title','string',unique=True,length=255))
db.define_table('task',
Field('title','string',unique=True,length=255),
Field('course_id','reference courses'))
db.define_table('belong',
Field('task_id','reference task'),
Field('problem_id','reference problem')
)
db.belong.task_id.requires=IS_IN_DB(db,'task.id','%(title)s')
db.belong.problem_id.requires=IS_IN_DB(db,'problem.id','%(title)s')
Я использую SQLFORM для вставки в belong
Таблица. Я хочу, чтобы не было повторяющихся задач и проблем. Предположим, что есть запись, как (1,task1,problem1)
уже существует в belong
таблицу, то, если я выберу task1 в SQLFORM, как сделать, чтобы раскрывающийся список problem_id не отображал problem1. Я нашел подобный вопрос здесь и сделаю некоторый тест как следующее в db.py
:
test1:
db.belong.problem_id.requires=IS_NOT_IN_DB(db(db.belong.task_id==request.vars.task_id),'belong.problem_id').
test2:
db.belong.problem_id.requires=IS_NOT_IN_DB(db(db.belong.task_id==request.vars.task_id),'problem.id','%(title)s').
test3:
def my_form_processing(form):
a = form.vars.task_id
b=form.vars.problem_id
query=(db.belong.task_id==a)&(db.belong.problem_id==b)
if query :
form.errors.a= 'the record has existed'
def assignproblem():
form=SQLFORM(db.belong)
if form.process(onvalidation=my_form_processing).accepted:
response.flash='form accepted'
elif form.errors:
response.flash='form has errors'
else:
response.flash='please fill out the form'
return dict(form=form)
но это все еще не решено.
1 ответ
Если вы хотите, чтобы варианты выбора в раскрывающемся файле problem_id изменялись динамически в зависимости от выбора task_id, вам потребуется использовать JavaScript (и, вероятно, сделать запрос Ajax для заполнения раскрывающегося списка). Для возможных решений смотрите этот ответ.
Что касается ваших тестов выше, test1 должен выполнить правильную проверку, но только после отправки формы (т. Е. Форма позволит выбрать любую комбинацию task_id и problem_id, но затем сообщит об ошибке, если была передана дублирующая комбинация).).
test3 не работает как есть, потому что query
Объект просто определяет запрос к базе данных, фактически не делая выбор из базы данных. Вместо этого вы должны позвонить .select()
метод, или, проще говоря, .count()
метод:
if db((db.belong.task_id == a) & (db.belong.problem_id == b)).count():
form.errors.a= 'the record has existed'