我如何构建喜欢的功能使用django和django的框架?



我使用DjangoDjangoRestFramework来构建一个社交媒体应用程序,我在后端构建like按钮的功能时遇到了一些问题。下面是我当前代码的演练和我得到的error:

models.py

from django.db import models
from django.contrib.auth import get_user_model
User = get_user_model()
class Post(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
created_by = models.ForeignKey(User, on_delete=models.CASCADE)
content = models.TextField(blank=True)
class Meta:
ordering = ('-created_at',)
class Like(models.Model):
post = models.ForeignKey(Post, related_name='likes', on_delete=models.CASCADE)
created_by = models.ForeignKey(User, related_name='likes', on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)

serializers.py

from rest_framework import serializers
from apps.feed.models import Post, Like
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
read_only_fields = (
"id",
"created_at",
"created_by",
)
fields = (
"id",
"created_at",
"created_by",
"content",
)

class LikeSerializer(serializers.ModelSerializer):
class Meta:
model = Like
read_only_fields = (
"id",
"created_at",
"created_by",
)
fields = (
"id",
"created_at",
"created_by",
"post"
)

views.py

from rest_framework import viewsets 
from apps.feed.models import Post 
from apps.feed.serializers import PostSerializer, LikeSerializer
from django.contrib.auth import get_user_model
from .models import Post
User = get_user_model()
class PostViewSet(viewsets.ModelViewSet):
serializer_class = PostSerializer
queryset = Post.objects.all()
def perform_create(self, serializer):
serializer.save(created_by=self.request.user)
def get_queryset(self):
return self.queryset.filter(created_by=self.request.user)
class LikeViewSet(viewsets.ModelViewSet):
serializer_class = LikeSerializer
def perform_create(self, serializer):
serializer.save(created_by=self.request.user)

AddLike.js

import React, { Component } from "react";
import PropTypes from "prop-types";
import { connect } from "react-redux";
import { withRouter } from "react-router-dom";
import { addLike, deleteLike } from "./LikeActions";
function LikeButton(props) {
return (
<button onClick={props.onClick}>
Like
</button>
)
}
function LikedButton(props) {
return (
<button onClick={props.onClick}>
Liked
</button>
)
} 
class AddLike extends Component {
constructor(props) {
super(props);
this.state = {
like: false
}
}
onChange = e => {
this.setState({ [e.target.name]: e.target.value });
};
handleAddLike = () => {
const like = {
like: this.state.like
};
this.setState({like: true})
this.props.addLike(like);
};
handleDeleteLike = () => {
const like = {
like: this.state.like
};
this.setState({like: false})
this.props.deleteLike(like);
}
render() {
const like = this.state.like;
let button;
if (like) {
button = <LikedButton onClick={this.handleDeleteLike}/>;
} else {
button = <LikeButton onClick={this.handleAddLike}/>;
}
return (
<div>
{button}
</div>
);
}
}
AddLike.propTypes = {
addLike: PropTypes.any
}
const mapStateToProps = state => ({});
export default connect(mapStateToProps, { addLike, deleteLike })(withRouter(AddLike));

LikeActions.js

import axios from "axios";
import { toastOnError } from "../../../utils/Utils";
import { ADD_LIKE, DELETE_LIKE } from "./LikeTypes";
export const addLike = like => dispatch => {
axios
.post(`/api/v1/add_like/`, like)
.then(response => {
dispatch({
type: ADD_LIKE,
payload: response.data
});
})
.catch(error => {
toastOnError(error);
});
};
export const deleteLike = id => dispatch => {
axios
.delete(`/api/v1/add_like/${id}/`)
.then(response => {
dispatch({
type: DELETE_LIKE,
payload: id
});
})
.catch(error => {
toastOnError(error);
})
}

当我按下like按钮时的error:

# This is the JSON being logged
{post: ["This field is required."]}
# This is the error on the server
Bad Request: /api/v1/add_like/
"POST /api/v1/add_like/ HTTP/1.1" 400 36

error当我unlike一个帖子:

AssertionError: 'LikeViewSet' should either include a `queryset` attribute, or override the `get_queryset()` method.
[16/Feb/2021 14:29:25] "DELETE /api/v1/add_like/[object%20Object]/ HTTP/1.1" 500 93663

我为这篇文章的长度道歉-我感谢任何提供的帮助:提前感谢!

您可以将具有ManyToMany关系的User模型链接到Post模型,而不是为Like创建单独的模型。

class Post(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
created_by = models.ForeignKey(User, on_delete=models.CASCADE)
content = models.TextField(blank=True)
likes = models.ManyToManyField(User,blank=True,related_name='likes')
class Meta:
ordering = ('-created_at',)

你可以为喜欢和不喜欢做你自己的APIView。

例如。

Class AddLikeUnlikeView(APIView):
permission_classes = [permissions.IsAuthenticated]
def post(self,request,post_id):
post = Post.objects.get(pk=post_id)
if post.likes.filter(pk=request.user.pk).exists():                                                              
post.likes.remove(request.user)
else:           
post.likes.add(request.user)  
return Response..     

urls . py

path('like/unlike/<int:post_id>', AddLikeUnlikeView.as_view(), name='like_unlike')     

或者如果你想坚持当前的模型

def post(self,request,post_id):
post = Post.objects.get(pk=post_id)
if Like.objects.filter(post=post, created_by=request.user).exists():
Like.objects.filter(post=post, created_by=request.user).delete()                                                       
else:           
Like.objects.create(post=post,created_by=request.user)  
return Response..     

在PostViewSet(viewsets.ModelViewSet)中,删除queryset或get_queryset


class PostViewSet(viewsets.ModelViewSet):
serializer_class = PostSerializer
def perform_create(self, serializer):
serializer.save(created_by=self.request.user)
def get_queryset(self):
return Post.objects.filter(created_by=self.request.user)

我们需要在视图集中定义queryset或包含get_queryset方法。

最新更新