gpt4 book ai didi

python - Django/Python 干 : how to avoid repeat code when working with Q objects and model attributes

转载 作者:太空宇宙 更新时间:2023-11-04 03:58:06 27 4
gpt4 key购买 nike

我正在尝试构建一个搜索页面,使用户能够找到满足特定阈值标准的模型的任何实例,并且在避免严重冗余代码方面遇到困难。我希望有更好的方法来做到这一点。这是一个稍微做作的示例,应该说明我正在尝试做什么,并在最后调整相关代码。用户将使用复选框与搜索进行交互。

模型.py:

class Icecream(models.Model()):
name = models.CharField()
bad_threshold = models.IntegerField()
okay_threshold = models.IntegerField()
tasty_threshold = models.IntegerField()
delicious_threshold = models.IntegerField()

views.py:

def search_icecreams(request):
user = request.user
q_search = None

if 'taste_search' in request.GET:
q_search = taste_threshold_set(request, user, q_search)

if q_search == None:
icecream_list = Icecream.objects.order_by('name')
else:
icecream_list = College.objects.filter(q_search)

context = { 'icecream_list' : icecream_list }
return render(request, '/icecream/icecreamsearch.html', context)

我要删减的相关代码如下,这几乎是直接来 self 的项目,只是名称有所更改。

def taste_threshold_set(request, user, q_search):
threshold = request.GET.getlist('taste_search')
user_type_tolerance = user.profile.get_tolerance_of(icea

# 1-5 are the various thresholds. They are abbreviated to cut down on the
# length of the url.
if '1' in threshold:
new_q = Q(bad_threshold__gt = user.profile.taste_tolerance)

if q_search == None:
q_search = new_q
else:
q_search = (q_search) | (new_q)

if '2' in threshold:
new_q = Q(bad_threshold__lte=user.profile.taste_tolerance) & \
~Q(okay_threshold__lte=user.profile.taste_tolerance)

if q_search == None:
q_search = new_q
else:
q_search = (q_search) | (new_q)

if '3' in threshold:
new_q = Q(okay_threshold_3__lte=user.profile.taste_tolerance) & \
~Q(tasty_threshold__lte=user.profile.taste_tolerance)

if q_search == None:
q_search = new_q
else:
q_search = (q_search) | (new_q)

if '4' in threshold:
new_q = Q(tasty_threshold__lte=user.profile.taste_tolerance) & \
~Q(delicious_threshold__lte=user.profile.taste_tolerance)

if q_search == None:
q_search = new_q
else:
q_search = (q_search) | (new_q)

if '5' in threshold:
new_q = Q(delicious_threshold__lte = user.profile.taste_tolerance)

if q_search == None:
q_search = new_q
else:
q_search = (q_search) | (new_q)

return q_search

基本上,我希望用户能够找到满足给定阈值级别的特定对象的所有实例。因此,例如,所有他们会觉得不好的冰淇淋和所有他们会觉得好吃的冰淇淋。

我对这段代码有很多不满意的地方。我不喜欢检查是否还没有为每个可能的阈值实例化 Q 对象,但看不到绕过它的方法。此外,如果这是一个非 Django 问题,我会使用一个循环来检查每个给定的阈值,而不是写出每个阈值。但同样,我不确定该怎么做。

最后,最大的问题是,我需要检查模型大约 20 个不同属性的阈值。就目前而言,我必须为每个阈值检查器编写一个新的阈值检查器,每个阈值检查器都与另一个略有不同(它们正在检查的属性的名称)。我希望能够编写一个通用检查器,然后将特定属性传递给它。有什么办法可以解决这个问题,或者我的另外两个问题吗?

谢谢!

最佳答案

这种方法怎么样?

query_arg = ['bad_threshold__lte', 'bad_threshold__lte', 'okay_threshold_3__lte', 'tasty_threshold__lte', 'delicious_threshold__lte']

Q(**{query_arg[int(threshold) - 1]: user.profile.taste_tolerance})

关于python - Django/Python 干 : how to avoid repeat code when working with Q objects and model attributes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17223559/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com