从类型为Foreignkey的字段中选择值

时间:2019-09-08 21:56:30

标签: python django django-rest-framework

“”“我正在使用DRF创建API(注释)。现在我很困惑,我需要获得一个专辑以便可以完全创建我的api,但是到目前为止,除专辑之外的所有其他字段都出现了。     专辑= serializers.CharField(来源='comments.name_album',read_only = True)没有帮助。这就是我在答案中得到的全部答案{“ album”:“”,“ post”:“ ahsdh”,“ author”:“ philip”,“ text”:“ ahsdhah”}“”“

class AlbumCreateSerializer(serializers.ModelSerializer):
    album = serializers.CharField(source='comments.name_album', read_only=True)
    class Meta:
        model = Comments
        fields = [
                    'album',
                    'post',
                    'author',
                    'text',
                  ]

#apiview
class AlbumCreateAPIView(CreateAPIView):
    queryset = Comments.objects.all()
    serializer_class = AlbumCreateSerializer
    permission_classes = [IsAuthenticated, IsAdminUser]

    def post(self, request,pk=None, *args, **kwargs):
        serializer = self.serializer_class(data=request.data)
        if serializer.is_valid():
            ready_data = serializer.save()
            return Response(ready_data.data, status=status.HTTP_201_CREATED)
        return Response(serializer.data, status=status.HTTP_400_BAD_REQUEST)

#model 
class Comments(models.Model):
    album = models.ForeignKey(Album, on_delete=models.CASCADE, related_name='comments')
    post = models.CharField(max_length=100)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    text = models.TextField(max_length=500)
    publish_date = models.DateTimeField(default=timezone.now())

    def __str__(self):
        return self.text

#ajax$
('#post_form').on('submit', function(event){
    event.preventDefault();
    $.ajax({
        type: 'POST',
        url: 'http://localhost:8000/api/albums/create/',
        data: {
            'post': $('#post').val(),
            'text': $('#text').val(),
            'author': $('#author').val(),
            'album': $('#album').val(),
            csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken]').val()
            },
            success: function(data){
                console.log(data);
        }
    });
});

#html form
<form id="post_form" method="post" action="/api/albums/create/">
    <input type="hidden" name="csrfmiddlewaretoken">
    <input type="hidden" id="author" value="{{ user }}">
    <input type="hidden" id="album" value="{{ comments.name_album }}">
    <input type="text" id="post"></br>
    <input type="text" id="text"></br>
    <button>submit</button>
 </form>

1 个答案:

答案 0 :(得分:0)

您的创建序列化程序应定义一个create方法,而不要发布。

示例https://www.django-rest-framework.org/api-guide/serializers/#saving-instances

class AlbumCreateAPIView(CreateAPIView):
    queryset = Comments.objects.all()
    serializer_class = AlbumCreateSerializer
    permission_classes = [IsAuthenticated, IsAdminUser]

    def create(self, request,pk=None, *args, **kwargs):
        serializer = self.serializer_class(data=request.data)
        if serializer.is_valid():
            ready_data = serializer.save()
            return Response(ready_data.data, status=status.HTTP_201_CREATED)
        return Response(serializer.data, status=status.HTTP_400_BAD_REQUEST)