1
1
from ckeditor_uploader .fields import RichTextUploadingField
2
2
from django .db import models
3
+ from django .db .models import Case , When , CharField
4
+ from django .db .models .functions import Substr , Lower , Trim
3
5
from django .core .exceptions import ValidationError
4
6
from django .urls import reverse
5
7
@@ -15,13 +17,42 @@ def validate_format_other(value, format_type):
15
17
raise ValidationError ("Please provide format details; you've selected 'other' " )
16
18
17
19
20
+ class FilmManager (models .Manager ):
21
+ def get_queryset (self ):
22
+ """Order films first by number, then alphabetically, discarding prefix if they start with 'The' or 'A'"""
23
+ return (
24
+ super ()
25
+ .get_queryset ()
26
+ .annotate (
27
+ # annotate a field for sorting the title, ignoring "A " or "The "
28
+ sort_title = Case (
29
+ # starts with "The"
30
+ When (
31
+ title__iregex = r"^The\s+" ,
32
+ then = Lower (Trim (Substr ("title" , 5 ))),
33
+ ),
34
+ # starts with "A"
35
+ When (
36
+ title__iregex = r"^A\s+" ,
37
+ then = Lower (Trim (Substr ("title" , 3 ))),
38
+ ),
39
+ # then other titles
40
+ default = Lower (Trim ("title" )),
41
+ output_field = CharField (),
42
+ ),
43
+ )
44
+ .order_by ("sort_title" )
45
+ )
46
+
47
+
18
48
class Film (models .Model ):
19
49
def __str__ (self ):
20
50
return f"{ self .title } "
21
51
22
52
def get_absolute_url (self ):
23
53
return reverse ("film_detail" , kwargs = {"pk" : self .pk })
24
54
55
+ objects = FilmManager ()
25
56
title = models .CharField (max_length = 100 )
26
57
alt_titles = models .TextField (
27
58
blank = True ,
0 commit comments