0

Model.objects.raw()で「%s%のような」クエリステートメントを使用してdjangoに問題があります。問題は「%」文字にあると思いますが、どこにあるのかわかりません。ここに私のモデルのコードがあります:

def listInRange(self, placeLat, placeLng, typeId, range, placeTag):
    tags = ''
    if placeTag:
        tags = "AND (placeTag LIKE '%" + "%' OR placeTag LIKE '%".join(placeTag.split(',')) + "%')"

    query = "SELECT *, \
            ( \
                6371000 * \
                acos( \
                    cos( radians(%s) ) * \
                    cos( radians(placeLat) ) * \
                    cos( radians(placeLng) - radians(%s) ) + \
                    sin( radians(%s) ) * \
                    sin( radians(placeLat) ) \
                ) \
            ) AS placeDistance, \
        COUNT(r.reviewId) as placeReviews, \
        (SUM(r.reviewPointPrice)/COUNT(r.reviewId)+SUM(r.reviewPointService)/COUNT(r.reviewId)+SUM(r.reviewPointLocation)/COUNT(r.reviewId)+SUM(r.reviewPointCondition)/COUNT(r.reviewId)+SUM(r.reviewPointComfort)/COUNT(r.reviewId))/5 AS averagePoint \
        FROM place_place p \
        LEFT JOIN review_review r \
        ON r.reviewPlace_id = p.placeId\
        WHERE placeType_id = %s %s \
        GROUP BY p.placeId \
        HAVING placeDistance < %s \
        ORDER BY placeDistance"

    return Place.objects.raw(query, [placeLat, placeLng, placeLat, typeId, tags, range])

placeTag が空でない場合は、WHERE 条件に追加されます。placeTag が空の場合、そのような問題はありませんが、placeTag が空でない場合、次のエラーが発生しました。

Warning: Truncated incorrect DOUBLE value: '1AND (placeTag LIKE '%cafe%' OR placeTag LIKE '%pub%')'

「like」ステートメントでModel.objects.raw()を使用してSQLステートメントを作成するより良い方法は何ですか?

4

1 に答える 1