【问题标题】:MultipleObjectsReturned - get() returned more than one ContentType -- it returned 2MultipleObjectsReturned - get() 返回多个 ContentType - 它返回 2
【发布时间】:2017-04-27 08:37:22
【问题描述】:

一切正常,然后突然出现这个错误

MultipleObjectsReturned at /rohit/post/new-post/

get() 返回了多个 ContentType -- 它返回了 2!

我不知道为什么它返回 2 个对象。它只是假设返回一个,我不能 想办法。帮帮我,伙计们。这是我的代码:

models.py:

class Comment(models.Model):
    user        = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')
    parent      = models.ForeignKey("self", null=True, blank=True)

    content     = models.TextField()
    timestamp   = models.DateTimeField(auto_now_add=True)

    objects = CommentManager()

    class Meta:
        ordering = ['timestamp']


    def __unicode__(self):  
        return str(self.user.username)

    def __str__(self):
        return str(self.user.username)

    def get_absolute_url(self):
        return reverse("comments:thread", kwargs={"id": self.id})

    def get_delete_url(self):
        return reverse("comments:delete", kwargs={"id": self.id})
        
    def children(self): #replies
        return Comment.objects.filter(parent=self)

    @property
    def is_parent(self):
        if self.parent is not None:
            return False
        return True

Views.py:

instance = get_object_or_404(Post, slug = slug)
initial_data = {
            "content_type": instance.get_content_type,
            "object_id": instance.id
    }
    print(initial_data)
    form = CommentForm(request.POST or None, initial= initial_data)
    if form.is_valid() and request.user.is_authenticated():
        c_type = form.cleaned_data.get("content_type")
        print('c_type : ',c_type)
        content_type = ContentType.objects.get(model=c_type)
        print(content_type)
        obj_id = form.cleaned_data.get('object_id')
        content_data = form.cleaned_data.get("content")
        parent_obj = None
        try:
            parent_id = int(request.POST.get("parent_id"))
        except:
            parent_id = None

        if parent_id:
            parent_qs = Comment.objects.filter(id=parent_id)
            if parent_qs.exists() and parent_qs.count() == 1:
                parent_obj = parent_qs.first()


        new_comment, created = Comment.objects.get_or_create(
                            user = request.user,
                            content_type= content_type,
                            object_id = obj_id,
                            content = content_data,
                            parent = parent_obj,
                        )

Forms.py:

class CommentForm(forms.Form):
    content_type = forms.CharField(widget=forms.HiddenInput)
    object_id = forms.IntegerField(widget=forms.HiddenInput)
    #parent_id = forms.IntegerField(widget=forms.HiddenInput, required=False)
    content = forms.CharField(label='',widget=forms.Textarea(attrs={'class':"mdl-textfield__input",'type':"text", 'rows':"3", 'id':"sample5"}))

【问题讨论】:

  • 好吧,ContentType.objects.get(model=c_type) 显然返回不止一种内容类型。
  • 您从 db 获取的请求具有多个相同搜索条目。

标签: django django-models django-views django-contenttypes


【解决方案1】:

我刚遇到这个问题。

在您的数据库中,有一个名为 django_content_type 的表。

因为你有一些旧的 content_type 同名。

你可以使用 sqlitebrowser 来删除这些。

【讨论】:

    【解决方案2】:

    如果你想调试,我建议你使用filter而不是get。

    在你看来:

    content_type = ContentType.objects.filter(model=c_type)
    print(content_type)
    

    现在在 content_type 中,您将拥有 2 个对象。

    【讨论】:

      猜你喜欢
      • 2022-08-24
      • 2016-08-13
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      • 2022-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多