Django 2.2.2: «Менеджер не доступен через (модель) экземпляры» на Admin - PullRequest
0 голосов
/ 06 июня 2019

Привет ТАК,

Я только что создал две модели:

models.py

from django.db import models
from django.contrib.auth.models import User
import uuid
from uuid_upload_path import upload_to
from django.core.exceptions import ValidationError
from django.utils.functional import cached_property
from django.utils.translation import gettext_lazy as _


class StorageObject(models.Model):
    name = models.CharField(max_length=200)
    text = models.TextField(blank=True)
    slug = models.UUIDField(default=uuid.uuid4)
    display = models.BooleanField(default=True)
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    # types
    file = models.FileField(upload_to=upload_to, blank=True, null=True)
    image = models.ImageField(upload_to=upload_to, blank=True, null=True)
    link = models.URLField(blank=True)

    @cached_property
    def file_type(self):
        if self.file:
            return 1
        elif self.image:
            return 2
        elif self.link:
            return 3

    def clean(self):
        if self.file and (self.image or self.link):
            raise ValidationError(_('Storage Objects can only contain one storage type each'))
        elif self.image and (self.link or self.file):
            raise ValidationError(_('Storage Objects can only contain one storage type each'))
        elif self.link and (self.file or self.image):
            raise ValidationError(_('Storage Objects can only contain one storage type each'))
        if not (self.link or self.image or self.file):
            raise ValidationError(_('Storage Objects must contain exactly one storage type'))

    def __str__(self):
        return '%s (by %s)' % (self.name, self.owner)


class Collection(models.Model):
    name = models.CharField(max_length=200)
    active = models.BooleanField(default=True)
    objects = models.ManyToManyField(StorageObject)
    owner = models.ForeignKey(User, on_delete=models.CASCADE)

Как видно из названия, я получаю AttributeError всякий раз, когда пытаюсь создать Collection через интерфейс администратора. Однако создание StorageObject отлично работает и тщательно очищается.

Я гуглил об этом сообщении, и большинство людей, кажется, где-то забыли скобки экземпляра (например, StorageObject ()). Может быть, я слепой, но я просто не могу найти ошибку.

Итак, я продолжил и удалил свои пользовательские функции file_type и clean, но результат все тот же.

Что мне здесь не хватает? Спасибо за ваше время!

Stack

 File "C:\Users\[..]\venv\lib\site-packages\django\db\models\manager.py", line 176, in __get__
        raise AttributeError("Manager isn't accessible via %s instances" % cls.__name__)
    AttributeError: Manager isn't accessible via Collection instances

1 Ответ

1 голос
/ 06 июня 2019

Не добавляйте поле objects на ваших моделях, это противоречит модели Manager, которая также называется objects. Collection.objects должен вернуть Manager, если вы не решите дать ему другое имя (см. здесь ).

...