Ограничение внешнего ключа, несмотря на наличие ссылок на записи в ссылочной таблице в web2py при использовании SQLFORM для пользователей с идентификатором> 3 - PullRequest
0 голосов
/ 12 декабря 2018

Я получаю сообщение об ошибке «Не удалось выполнить ограничение внешнего ключа».У меня есть записи в ссылочных таблицах, хотя.Это происходит только для вошедшего в систему пользователя. Он отлично работает для пользователей с идентификатором <= 3, но не для других. </p>

Вот соответствующий код db.py:

    db.define_table('Roles',    
            Field('person', db.auth_user),    
            Field('role'))    
    db.define_table('Doctors',
            Field('doctor', db.auth_user, required = True),    
            Field('age', 'integer', required = True),    
            Field('qualification'),    
            Field('specialization'),    
            format = '%(doctor)s'    
            )    

    db.define_table('Patients',    
            Field('patient', db.auth_user, required = True),    
            Field('age', 'integer', required = True),    
            Field('doctor', db.Doctors, required = True),     
            Field('temperature', 'double'),     
            Field('blood_pressure', 'double'),     
            Field('haemoglobin', 'double'),     
            Field('contact_name'),     
            Field('contact_phone', 'bigint'),     
            format = '%(patient)s'     
           )     

    db.define_table('Assignments',     
            Field('doctor', 'reference Doctors', unique = False),     
            Field('patient', 'reference Patients', unique = False))     

Вотсоответствующий код default.py:

def registerRole():    
role = int(request.args[0])    
form = FORM()    
if role == 1:    
    form = SQLFORM(db.Doctors).process()    
elif role == 2:    
    form = SQLFORM(db.Patients).process()    
if form.accepted:    
    response.flash = 'form accepted'    
    if role == 1:    
        db.Roles.insert(person = auth.user.id, role = 'doctor')
            auth.add_membership(auth.id_group('doctor'),auth.user.id)
        elif role == 2:
            i = 1
           db.Assignments.insert(doctor = int(form.vars.doctor), patient = auth.user.id)    
         db.Roles.insert(person = auth.user.id, role = 'patient')    
         auth.add_membership(auth.id_group('patient'),auth.user.id)    
     redirect(URL('index'))    
else:    
    response.flash = form.errors    
return dict(form = form, role = role)    

Пожалуйста, помогите мне в этом вопросе.Я застрял в нем довольно давно.Любая помощь приветствуется.

1 Ответ

0 голосов
/ 12 декабря 2018
db.Assignments.insert(doctor = int(form.vars.doctor), patient = auth.user.id)

Выше вы устанавливаете значение patient в auth.user.id, что является id в таблице auth_user.Однако поле patient для Assignments должно быть id из таблицы Patients, так как оно имеет тип reference Patients.Вместо этого вам, вероятно, понадобится id записи, которая была просто вставлена ​​в Patients формой, которая находится в form.vars.id:

db.Assignments.insert(doctor = int(form.vars.doctor), patient = form.vars.id)

Кроме того, учтите, что auth.user.id всегда являетсяid текущего пользователя.Не ясно, подходит ли вам другое использование auth.user.id (т. Е. С db.Roles.insert и auth.add_membership), поскольку пользователь, выбранный в качестве врача или пациента в форме, не обязательно будет зарегистрированным пользователем.

...