def get_diff_data(serializer):
    if not has_changes(serializer):
        return None

    data = {}

    changed_fields = get_changed_fields(serializer)
    orig = get_original_representation(serializer)

    for column_name in serializer.initial_data:
        field = serializer.fields.get(column_name, None)
        if not field:
            continue

        data[column_name] = field_data = []

        if column_name in orig:
            field_data.append(
                fields.to_string_representation(field, orig[column_name])
            )
        else:
            field_data.append(u'')

        field_change = changed_fields.get(column_name, None)

        if not field_change:
            continue

        new_value = field_change.new

        field_data.append(
            fields.to_string_representation(field, new_value)
        )

    return data
 def get_export_row(self, serializer, instance):
     results = []
     representation = serializer.to_representation(instance=instance)
     for column_name, value in representation.items():
         field = serializer.fields[column_name]
         val = fields.to_string_representation(field, value)
         # TODO: Excel escaping should be done for Excel/CSV formats
         results.append(strings.excel_escape(val))
     return results
def might_have_changes(serializer):
    submitted_fields = [
        (field_name, field)
        for field_name, field in serializer.fields.items()
        if field_name in serializer.initial_data
        and not field.read_only and not field.write_only
    ]

    rep = serializer.to_representation(serializer.instance)

    initial = {
        field_name: fields.to_string_representation(
            field, serializer.initial_data[field_name]
        )
        for field_name, field in submitted_fields
    }

    result = {
        field_name: fields.to_string_representation(field, rep[field_name])
        for field_name, field in submitted_fields
    }

    return result != initial