एक ड्राई फंक्शन लिखना जो किसी दिए गए इंस्टेंस के पिछले या अगले इंस्टेंस को लौटाता है।

यह फ़ंक्शन पिछले उदाहरण लौटाता है:

def previous(instance):
    try:
        return Picture.objects.filter(id__lt=instance.id).first()
    except Picture.DoesNotExist:
        return instance

मैं एक सारगर्भित फ़ंक्शन बनाना चाहता हूं जो एक अतिरिक्त gt_or_lt तर्क का उपयोग करके पिछला या अगला उदाहरण देता है। समस्या उस तर्क को filter(id__gt_or_lt) में प्रक्षेपित करने में है।

def seek_instance(gt_or_lt, instance):
    try:
        return Picture.objects.filter(id__gt_or_lt=instance.id).first()
    except Picture.DoesNotExist:
        return instance

मैंने कोशिश की:

return Picture.objects.filter(id__gt_or_lt = instance.id).first()
seek_instance("gt", instance)
return Picture.objects.filter(id__f"{gt_or_lt}" = instance.id).first()
seek_instance("gt", instance)
return Picture.objects.filter(f"{gt_or_lt}" = instance.id).first()
return Picture.objects.filter(gt_or_lt = instance.id).first()
seek("id__gt", instance)

सभी अपनी-अपनी त्रुटियों के साथ विफल हो जाते हैं।

1
PersonPr7 4 सितंबर 2019, 22:06

2 जवाब

सबसे बढ़िया उत्तर

Kwargs विस्तार के साथ एक शब्दकोश का प्रयोग करें।

return Picture.objects.filter(**{f"id__{gt_or_lt}": instance.id})
2
Daniel Roseman 4 सितंबर 2019, 22:13

आप शब्दकोश विस्तार का उपयोग कर सकते हैं, जैसे @DanielRoseman सुझाव देते हैं। लेकिन वह अभी भी पिछले, या अगले आइटम को प्रस्तुत नहीं करेगा। उदाहरण के लिए यदि मॉडल में एक है ordering विकल्प [Django-doc], तो यह संभव है कि ऑर्डर id से अलग हो। इसके अलावा, पिछले एक के लिए, आपको ऑर्डरिंग को उलटना होगा।

इसके अलावा, स्थिति के आधार पर, आप यह रोकना चाहेंगे कि seek_instance को एक अलग लुकअप दिया जा सकता है, जैसे 'in' उदाहरण के लिए।

इस प्रकार हम उस आइटम पर शाखा लगाने के लिए if … elif … else का उपयोग कर सकते हैं जिसे हम पुनर्प्राप्त करना चाहते हैं, और यदि आप किसी अन्य लुकअप का उपयोग करते हैं तो ValueError बढ़ा सकते हैं:

def seek_instance(lt_or_gt, instance):
    try:
        if lt_or_gt == 'lt':
            return Picture.objects.filter(pk__lt=instance.pk).order_by('-pk').first()
        elif lt_or_gt == 'gt':
            return Picture.objects.filter(pk__gt=instance.pk).order_by('pk').first()
        else:
            raise ValueError("Should be 'lt' or 'gt'")
    except Picture.DoesNotExist:
        return instance
1
Willem Van Onsem 4 सितंबर 2019, 22:30