Django Model returning NoneType

12,709

Solution 1

NoneType is the type that the None value has. You want to change the second snippet to

if current_product.size: # This will evaluate as false if size is None or len(size) == 0.
  blah blah

Solution 2

NoneType is Pythons NULL-Type, meaning "nothing", "undefined". It has only one value: "None". When creating a new model object, its attributes are usually initialized to None, you can check that by comparing:

if someobject.someattr is None:
    # Not set yet
Share:
12,709
fishu
Author by

fishu

Updated on June 04, 2022

Comments

  • fishu
    fishu almost 2 years

    I have a model Product

    it has two fields size & colours among others

    colours = models.CharField(blank=True, null=True, max_length=500)
    size = models.CharField(blank=True, null=True, max_length=500)
    

    In my view I have

    current_product = Product.objects.get(slug=title)
    if len(current_product.size) != 0 :
        current_product.size = current_product.size.split(",")
    

    and get this error:

    object of type 'NoneType' has no len()

    What is NoneType and how can I test for it?

  • fishu
    fishu over 15 years
    Cheers, I thought I'd tried that. That's why I was trying testing the length. Ah well. You get this on the big jobs
  • Ferdinand Beyer
    Ferdinand Beyer over 15 years
    In fact, Django will raise an exception in this case (Product.NotFound).
  • Ignacio Vazquez-Abrams
    Ignacio Vazquez-Abrams over 15 years
    Calling it "undefined" is a bit facetious. The variable/name is defined, but it has no useful value.
  • ruds
    ruds over 15 years
    You do at that. I like this idiom -- it eliminates an "or" that makes the code less readable, and that's easy to forget (as illustrated here :) )
  • user1066101
    user1066101 over 15 years
    Please use "is not None" rather than assuming that None is like False -- it make the if statement perfectly clear.
  • Carl Meyer
    Carl Meyer over 15 years
    @S.Lott: I don't see any reason to test for None specifically in this case. The purpose is to test whether current_product.size has any contents, and this does that more clearly than a complicated double-check for "is not None" and len().
  • ruds
    ruds over 15 years
    @Carl Meyer: Exactly. "is not None" is the correct idiom when you're testing for None-ness, but if you're checking whether a list is both non-None and has contents, use the list as a boolean value.