вернуть несколько объектов с одинаковым именем

MultipleObjectsReturned в /user/(имя объекта)/ Тип исключения: MultipleObjectsReturned

Метод запроса: ПОЛУЧИТЬ

Значение исключения: get() вернул более одного холста — он вернул 2!

Расположение исключения: C:\Users\user\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\db\models\query.py в get, строка 389

Несколько объектов с одинаковым именем, но у пользователя может быть только одно уникальное имя объекта.

Всякий раз, когда я создаю другой объект с тем же именем, я получаю эту ошибку (MultipleObjectsReturned). Я хочу разрешить каждому пользователю создавать одно уникальное имя объекта.

Например: user1 может иметь уникальное имя объекта (test), а user2 также может иметь уникальное имя объекта (test).

class Object(models.Model):
    user                = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
    object_name         = models.CharField(
                        max_length=100,
                        validators=[
                            # validate_canvas_title,
                            RegexValidator(
                                    regex=CANVAS_REGEX,
                                    message='Canvas must only contain Alpahnumeric characters',
                                    code='invalid_canvas_title'
                                )],
                        )
    slug                = models.SlugField(max_length=100, blank=True)

    class Meta:
        unique_together = ['user', 'object_name']

Посмотреть

def canvasView(request, username=None, slug=None):
    user = User.objects.get(username__iexact=username)
    object = get_object_or_404(Object, slug__iexact=slug)

    template = "pages/object.html"
    context = {
        'user' : user,
        'object': object,
    }
    return render(request, template, context)

person lolz    schedule 15.05.2017    source источник


Ответы (3)


Вам нужно использовать пользователя в запросе.

object = get_object_or_404(Object, user=user, slug__iexact=slug)
person Daniel Roseman    schedule 15.05.2017
comment
Как я могу получить объект через пользователя. сделать пользователя user.object_set.all(), а затем фильтровать? - person lolz; 15.05.2017
comment
Да, вы могли бы сделать user.object_set.get(slug__iexact=slug), но тогда вам пришлось бы перехватывать исключение ObjectNotFound и поднимать 404. - person Daniel Roseman; 15.05.2017

Функция get_object_or_404 возвращает объект, который удовлетворяет указанному условию, я должен помнить, что должен быть только один объект с указанным условием. Он не возвращает список или что-то в этом роде. Если найдено несколько объектов, то возвращается так называемая ошибка.

Вам нужно передать user в аргументы,

object_name = get_object_or_404(Object, user=user, slug__iexact=slug)

Или вы можете определить связанное ограничение имени в модели для пользовательского поля,

user = models.ForeignKey(User, related_name="my_objects")

Затем вы можете получить от пользовательских объектов напрямую,

user = User.objects.get(username=username)
object_name = user.my_objects.get(slug__iexact=slug)

Кроме того, использование ключевых слов Python по умолчанию для именования переменных строго не рекомендуется. «объект» является допустимым ключевым словом Python. Это просто не очень хорошая практика.

person zaidfazil    schedule 15.05.2017

Установите unique=True в поле модели object_name.

person wrdeman    schedule 15.05.2017
comment
но если я установлю его уникальным, он не позволит мне иметь несколько объектов с одинаковым именем. - person lolz; 15.05.2017
comment
Это не сработает, потому что «пользователь 1 может иметь уникальное имя объекта (тест), а пользователь 2 также может иметь уникальное имя объекта (тест)». Он мог бы использовать unique_together = (("user", "object_name"),). См. docs.djangoproject.com/en/1.11/ref/ модели/варианты/ - person Steffen; 15.05.2017