Django.core.exceptions.ValidationError: [''Значение "TRUE" должно быть либо True, либо False''].

Я пытаюсь загрузить данные в django ORM скриптом, для которого я написал следующее

    for index, row in df.iterrows():
        allocated = row['is_allocated']
        delivery_required_on = row['delivery_required_on']
        linked = row['linked']
        raised_by = row['raised_by']
        raised_for = Company.objects.get(pk=row['raised_for'])    ### double check
        rejected = row['is_rejected']
        reason = row['reason']
        remarks = row['remarks']
        created = row['created_at']
        owner = User.objects.get(pk=row['New owner'])  
        j = literal_eval(row['flows'])
        flows = []
        mobj = MaterialRequest.objects.create(owner=owner, is_allocated=allocated,
                                              delivery_required_on=delivery_required_on, linked=linked,
                                              raised_by=raised_by, raised_for=raised_for, is_rejected=rejected,
                                              reason=reason, remarks=remarks, created=created)

Он работает нормально, когда данные выглядят примерно следующим образом: enter image description here

Но как только is_allocated достигает False, появляется следующая ошибка: enter image description here

django.core.exceptions.ValidationError: [''Значение "TRUE" должно быть либо True или False']

.

Я не могу найти что-то связанное с этим

Похоже, что свойство is_allocated вашей модели является булевым. Поэтому вы должны присвоить ему булево значение. Но значения ваших столбцов в кадре данных являются строками TRUE и FALSE.

заменяя эту строку

allocated = row['is_allocated']

с

allocated = (row['is_allocated'] == 'TRUE')

может помочь.

если у вас есть None, отличные от True и False значения, учтите это тоже.

Это происходит потому, что вы пытаетесь хранить строку в булевом поле. Одно из решений - изменить тип строки на boolean. Возможно, наличие в вашем коде функции, подобной следующей, решит вашу проблему:

def to_boolean(raw_value: str) -> bool:
    if not isinstance(raw_value, str):
        raw_value = str(raw_value)
    raw_value = raw_value.strip()
    return {'true': True, 'false': False}.get(raw_value.lower(), False)

и затем используйте его в вашем цикле, как (где вы думаете, что тип вашего поля является булевым):

for index, row in df.iterrows():
    allocated = to_boolean(row['is_allocated'])
    delivery_required_on = row['delivery_required_on']
    linked = row['linked']
    raised_by = row['raised_by']
    raised_for = Company.objects.get(pk=row['raised_for'])    ### double check
    rejected = to_boolean(row['is_rejected'])
    reason = row['reason']
    remarks = row['remarks']
    created = row['created_at']
    owner = User.objects.get(pk=row['New owner'])  
    j = literal_eval(row['flows'])
    flows = []
    mobj = MaterialRequest.objects.create(owner=owner, is_allocated=allocated,
                                          delivery_required_on=delivery_required_on, linked=linked,
                                          raised_by=raised_by, raised_for=raised_for, is_rejected=rejected,
                                          reason=reason, remarks=remarks, created=created)
Вернуться на верх