Home > other >  Django filter - is DateTimeField filled
Django filter - is DateTimeField filled

Time:01-18

to my model I added a simply DateTimeField:

expired = models.DateTimeField(default=None)

. The value of the field can be either None or a Datetime.

I'd like to filter for objects where the expired is filled with any datum, however I'm struggling to find the right filter.

I think I tried all the combinations of filter / exclude and expired__isnull=True / expired=None, but I never get back the exact number.

What's the right way to filter if the field has a DateTime in it, or not?

Django: 1.11.16

Thanks.


In my model there're 2122 lines:

Counter(Obj.objects.filter().values_list('expired'))
Counter({(datetime.datetime(2021, 9, 24, 1, 6, 50),): 1,
     (datetime.datetime(2021, 9, 24, 1, 6, 51),): 1,
     (datetime.datetime(2021, 9, 24, 1, 6, 32),): 1,
     (datetime.datetime(2021, 9, 24, 1, 12, 3),): 1,
     (datetime.datetime(2021, 9, 24, 1, 12, 44),): 1,
     (datetime.datetime(2021, 12, 4, 1, 31, 25),): 1,
     (datetime.datetime(2021, 12, 4, 1, 37, 49),): 1,
     (datetime.datetime(2021, 12, 4, 1, 9, 55),): 1,
     (None,): 2087,
     (datetime.datetime(2021, 12, 4, 1, 37, 52),): 1,
     (datetime.datetime(2021, 12, 4, 1, 2, 8),): 4,
     (datetime.datetime(2021, 12, 4, 1, 5, 14),): 9,
     (datetime.datetime(2021, 9, 28, 0, 43, 51),): 1,
     (datetime.datetime(2021, 12, 4, 1, 0, 13),): 7,
     (datetime.datetime(2021, 12, 4, 1, 9, 59),): 2,
     (datetime.datetime(2021, 12, 3, 17, 25, 46),): 1,
     (datetime.datetime(2021, 12, 4, 1, 9, 54),): 1,
     (datetime.datetime(2021, 9, 24, 1, 14, 30),): 1})

.

Obj.objects.filter(expired__isnull=False).count() returns all the lines (2122) ... .

Obj.objects.filter(expired=None).count() returns 2087 lines instead of the 35 expected.

Obj.objects.exclude(expired=None).count() returns 2122, so all the lines.

CodePudding user response:

The query is good, the problem is in the model definition. It should be blank=True and null=True.

CodePudding user response:

try changing the field in Model

expired = models.DateTimeField(
        auto_now=False,
        null=True,
        blank=True
    )
  •  Tags:  
  • Related