【问题标题】:return multiple objects with same name返回多个同名对象
【发布时间】:2017-05-15 09:43:04
【问题描述】:

MultipleObjectsReturned at /user/(对象名称)/ 异常类型:MultipleObjectsReturned

请求方法:GET

异常值:get() 返回了多个 Canvas -- 它返回了 2 个!

异常位置:C:\Users\user\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\db\models\query.py in 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)

【问题讨论】:

    标签: django django-models django-views


    【解决方案1】:

    您需要在查询中使用用户。

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

    【讨论】:

    • 如何通过用户获取对象。我要用户 user.object_set.all(),然后过滤?
    • 是的,您可以使用user.object_set.get(slug__iexact=slug),但是您必须捕获 ObjectNotFound 异常并引发 404。
    【解决方案2】:

    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默认关键字命名变量。 “object”是一个有效的 python 关键字。这不是一个好习惯。

    【讨论】:

      【解决方案3】:

      在模型字段object_name上设置unique=True

      【讨论】:

      • 但如果我将其设置为唯一的,那么它将不允许我拥有多个具有相同名称的对象。
      • 这不起作用,因为'user1 可以有一个唯一的对象名称(test),而user2 也可以有一个唯一的对象名称(test)。'他可以使用unique_together = (("user", "object_name"),)。见docs.djangoproject.com/en/1.11/ref/models/options/…
      猜你喜欢
      • 2022-12-03
      • 2022-10-08
      • 1970-01-01
      • 2013-06-03
      • 2013-01-21
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多