返回具有相同名称的多个对象

时间:2017-05-15 09:43:04

标签: django django-models django-views

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,line 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)

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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关键字。这不是一个好习惯。

答案 2 :(得分:0)

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