Kubas
Kubas

Reputation: 1028

AttributeError: type object ... has no attribute 'objects'

fragment of models.py

class Hardware_type(models.Model):
    type = models.CharField(blank = False, max_length = 50, verbose_name="Type")
    description = models.TextField(blank = True, verbose_name="Description")
    slug = models.SlugField(unique = True, max_length = 255, verbose_name = "Slug")

class Software_type(models.Model):
    type = models.CharField(blank = False, max_length = 50, verbose_name="Type")
    description = models.TextField(blank = True, verbose_name="Description")
    slug = models.SlugField(unique = True, max_length = 255, verbose_name = "Slug")

and now

>>> sw = Software_type.objects.get(slug='unix')
>>> sw
<Software_type: Unix>
>>> hw = Hardware_type.objects.get(slug='printer')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: type object 'Hardware_type' has no attribute 'objects'

I can't see why this happens. Anyone can help me?

Edit:

sorry that did not sent all the code - problem solved. in another class I had

hardware_type = models.ManyToManyField(Hardware_type, verbose_name="Hardware Type")

after change from hardware_type to hw_type - works fine I did not know that can cause this problem.

Upvotes: 9

Views: 27803

Answers (4)

Lavina Khushlani
Lavina Khushlani

Reputation: 559

In my case, my model's meta class had abstract=True and i was using model.objects.all(). Since abstract cannot be instantiated, we cannot use this.

Upvotes: 0

Kubas
Kubas

Reputation: 1028

it turned out that only began to work in django console,

Later I noticed that I have some old code in forms.py

class Hardware_type(forms.ModelForm):
    class Meta:
        model = Hardware_type

and thus it did not work, it was a bad day for naming classes, etc.

Upvotes: 1

Udi
Udi

Reputation: 30472

Your code works for me:

>>> hw = Hardware_type.objects.get(slug='111')
>>> hw
<Hardware_type: Hardware_type object>

However, using the keyword type might be a little dangerous, and probably you would like to avoid using it.

Upvotes: 1

Ignacio Vazquez-Abrams
Ignacio Vazquez-Abrams

Reputation: 798446

If you add a custom manager to a model then the default manager at objects will not be created. Either add it yourself in the class definition, or stick with using the custom manager.

Upvotes: 13

Related Questions