简体   繁体   English

发布相同的按摩时,Django“唯一约束失败”

[英]Django 'UNIQUE constraint failed' when post same massages

I am building a socialsite.我正在建立一个社交网站。 In this site user create group and post messages.在此站点中,用户创建组并发布消息。 I get this error when user put same message in same group or even in other group.当用户将相同的消息放入同一组甚至其他组时,我会收到此错误。

**IntegrityError at /posts/new/ ** IntegrityError 在 /posts/new/

UNIQUE constraint failed: posts_post.user_id, posts_post.message唯一约束失败:posts_post.user_id、posts_post.message

Request Method: POST请求方式:POST

Request URL: http://127.0.0.1:8000/posts/new/请求网址: http : //127.0.0.1 : 8000/posts/new/

Django Version: 3.2.4 Django 版本:3.2.4

Exception Type: IntegrityError异常类型:IntegrityError

Exception Value: UNIQUE constraint failed: posts_post.user_id, posts_post.message异常值:唯一约束失败:posts_post.user_id、posts_post.message

Exception Location: F:\\Program Files\\envs\\MyDjangoEnv\\lib\\site-packages\\django\\db\\backends\\sqlite3\\base.py, line 423, in execute异常位置:F:\\Program Files\\envs\\MyDjangoEnv\\lib\\site-packages\\django\\db\\backends\\sqlite3\\base.py, line 423, in execute

Python Executable: F:\\Program Files\\envs\\MyDjangoEnv\\python.exe** Python 可执行文件:F:\\Program Files\\envs\\MyDjangoEnv\\python.exe**

Here is models.py:这是models.py:

class Post(models.Model):
    user = models.ForeignKey(User, related_name="posts",on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now=True)
    message = models.TextField()
    message_html = models.TextField(editable=False)
    group = models.ForeignKey(Group, related_name="posts",null=True, blank=True,on_delete=models.CASCADE)

    def __str__(self):
        return self.message

    def save(self, *args, **kwargs):
        self.message_html = misaka.html(self.message)
        super().save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse(
            "posts:single",
            kwargs={
                "username": self.user.username,
                "pk": self.pk
            }
        )

    class Meta:
        ordering = ["-created_at"]
        unique_together = ["user", "message"]

views.py:视图.py:

class PostList(SelectRelatedMixin, generic.ListView):
    model = models.Post
    select_related = ("user", "group")


class UserPosts(generic.ListView):
    model = models.Post
    template_name = "posts/user_post_list.html"

    def get_queryset(self):
        try:
            self.post_user = User.objects.prefetch_related("posts").get(
                username__iexact=self.kwargs.get("username")
            )
        except User.DoesNotExist:
            raise Http404
        else:
            return self.post_user.posts.all()

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["post_user"] = self.post_user
        return context


class PostDetail(SelectRelatedMixin, generic.DetailView):
    model = models.Post
    select_related = ("user", "group")

    def get_queryset(self):
        queryset = super().get_queryset()
        return queryset.filter(
            user__username__iexact=self.kwargs.get("username")
        )


class CreatePost(LoginRequiredMixin, SelectRelatedMixin, generic.CreateView):
    # form_class = forms.PostForm
    fields = ('message','group')
    model = models.Post

    
    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.user = self.request.user
        self.object.save()
        return super().form_valid(form)

forms.py表格.py

class PostForm(forms.ModelForm):
    class Meta:
        fields = ("message", "group")
        model = models.Post

    def __init__(self, *args, **kwargs):
        user = kwargs.pop("user", None)
        super().__init__(*args, **kwargs)
        if user is not None:
            self.fields["group"].queryset = (
                models.Group.objects.filter(
                    pk__in=user.groups.values_list("group__pk")
                )
            )

urls.py网址.py

urlpatterns = [
    path('', views.PostList.as_view(), name="all"),
    path("new/", views.CreatePost.as_view(), name="create"),
    path("by/<username>/",views.UserPosts.as_view(),name="for_user"),
    path("by/<username>/<int:pk>/",views.PostDetail.as_view(),name="single"),
    path("delete/<int:pk>/",views.DeletePost.as_view(),name="delete"),
]

your error are here:你的错误在这里:

unique_together = ["user", "message"]

here you are saying that you can only have one message for each user在这里,您是说每个用户只能有一条消息

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM