首页 > 解决方案 > DJANGO API POST:“此字段为必填项。”

问题描述

我是一名刚毕业的软件工程师,我想用 Django 写一个 API。这个 api 给了我这样的错误。我正在通过 PythonAnyWhere 发布。在Local中工作时没有问题,但是在PythonAnyWhere中有问题。问题:“此字段是必需的。” .. 你能帮助我吗 ?

我的序列化程序.py

from rest_framework import serializers
from Market.models import Urun, Kategori


class UrunSerializer(serializers.ModelSerializer):
    class Meta:
        model = Urun
        fields = [
            'urun_adi',
            'mevcut_adet',
            'alis_fiyati',
            'satis_fiyati',
            'barkodu',

        ]

我的观点.py

from rest_framework.filters import SearchFilter, OrderingFilter
from rest_framework import generics
from rest_framework.mixins import ListModelMixin, CreateModelMixin
from rest_framework.generics import (
    ListAPIView,
    RetrieveAPIView,
    DestroyAPIView,
    UpdateAPIView,
    CreateAPIView,
    RetrieveUpdateAPIView,
    ListCreateAPIView, GenericAPIView,
)

from Market.api.paginations import UrunPagination
from Market.models import Urun,Kategori,UrunSatis
from Market.api.serializers import (
    UrunSerializer,

)

#my custom permission
from Market.api.permissions import IsOwner

from rest_framework.views import APIView

from rest_framework.permissions import (
IsAuthenticated,
IsAdminUser,
)

from django.http import JsonResponse

from rest_framework.decorators import api_view
from rest_framework.response import Response

########FunctionBasedClass
######Bu kısmı generic views kullanıdığımız için geçtik
##### Ama bu kısma yer vermem gerekiyor.. Yapılacak
################





@api_view(['GET'])
def getRoutes(request):


                routes=[
                    {
                        'Endpoint':'api/market/UrunlerList/',
                        'method':'GET',
                        'body':None,
                        'description':'Returns an array of product / tüm ürünler listesini dönder'
                    },
                    {
                        'Endpoint': 'api/market/Kategoriler',
                        'method': 'GET',
                        'body': None,
                        'description': 'Returns a single product / kategorileri görüntüle'
                    },

                    {
                        'Endpoint': 'api/market/create/',
                        'method': 'GET',
                        'body': None,
                        'description': 'create a new product / yeni bir ürün ekle'
                    },

                    {
                        'Endpoint': 'api/market/delete/<slug>',
                        'method': 'GET',
                        'body': None,
                        'description': 'delete a one product with slug/ sluh yazarak bir ürünü sil'
                    },
                    {
                        'Endpoint': 'api/market/update/<slug>',
                        'method': 'GET',
                        'body': None,
                        'description': 'Update a product with slug/ Bİr ürünü güncellleme'
                    },
                    {
                        '-------------------------------- ---------------'
                    },
                    {
                        'Arama Url sorgusu için':'?search=kek',
                        'body':None,
                        'description':'arama yapmak için örneğin kek ( ürün adı üzerinden arama yapar)'
                    },
                    {
                        'Aramayı filtrelemek için':'?ordering=alis_fiyatı',
                        'body':None,
                        'description':'filtrelemeyi ve ya listeyi sıralamak için'
                    },

                ]
                return Response(routes)

class UrunListAPIView(ListCreateAPIView):


    serializer_class = UrunSerializer
    filter_backends = [SearchFilter,OrderingFilter]
    search_fields= ['urun_adi']
    pagination_class = UrunPagination
    def get_queryset(self):
        queryset=Urun.objects.filter(draft=False)
        return queryset

    #permission_classes = [permissions.IsAuthenticated]

class KategoriListAPIView(ListAPIView):
    queryset = Kategori.objects.all().order_by('-create_at')


class UrunDetailAPIView(RetrieveAPIView):
    queryset = Urun.objects.all()
    serializer_class = UrunSerializer
    lookup_field = 'slug'

class UrunDeleteAPIView(DestroyAPIView):
    queryset = Urun.objects.all()
    serializer_class = UrunSerializer
    lookup_field = 'slug'
    permission_classes = [IsOwner]
    """
class UrunUpdateAPIView(RetrieveUpdateAPIView):
    queryset = Urun.objects.all()
    serializer_class = UrunUpdateCreateAPISerializer
    lookup_field = 'slug'
    permission_classes = [IsOwner]
    def perform_update(self, serializer):
        serializer.save(modified_by=self.request.user)

class UrunCreateAPIView(ListCreateAPIView):
    queryset = Urun.objects.all()

    serializer_class = UrunUpdateCreateAPISerializer
    #permission_classes = [IsAuthenticated]



class UrunSatisCreateAPIView(CreateAPIView):
    queryset = UrunSatis.objects.all()

    serializer_class =UrunSatisUpdateCreateAPISerializer

    def perform_create(self, serializer):
        serializer.save(user=self.request.user)

"""
class UrunListCreateAPIView(ListModelMixin,CreateModelMixin,GenericAPIView):

    queryset = Urun.objects.all()
    serializer_class = UrunSerializer

    #listeliyor
    def get(self,request,*args,**kwargs):
        return self.list(request,*args,**kwargs)

    #create ediyor
    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

我正在使用“class UrunListAPIView(ListCreateAPIView):”来创建新产品。当我尝试创建一个新产品时,DJANGO 说“这个字段是必需的。”

****** 我的模型.py

from django.db import models
from slugify import slugify
from django.utils import timezone


from django.contrib.auth.models import User


class Kategori(models.Model):
    STATUS = (
        ('True','Evet'),
        ('False','Hayır'),
    )
    title = models.CharField(max_length=30,)
    keywords = models.CharField(blank=True,max_length=255)
    description = models.CharField(blank=True,max_length=255)
    image=models.ImageField(blank=True,upload_to='media/Market/Kategoriler')
    status=models.CharField(max_length=10,choices=STATUS)
    slug = models.SlugField(unique=True, max_length=150)
    parent = models.ForeignKey('self',blank=True,null=True, related_name='children', on_delete=models.CASCADE)



    create_at = models.DateTimeField(auto_now_add=True)

    update_at = models.DateTimeField(auto_now=True)



    def __str__(self):
        return self.title

    def get_slug(self):

        slug = slugify(self.title.replace("ı", "i"))
        # bolge isimlerinde ı ları i yaparak bolge ismine göre slug atar..
        unique = slug
        number = 1

        while Kategori.objects.filter(slug=unique).exists():
            unique = '{}-{}'.format(slug, number)
            # eğer aynı bolge girişi varsa yanına 1 ekleyecek devam edecek
            number += 1
        return unique

    def save(self, *args, **kwargs):
        if not self.id:  # eğer girdi varsa oluşturmuyor modified e geçiyor
            self.create_at = timezone.now()  # eğer girdi yoksa ona göre created date oluşturuyor

        self.update_at = timezone.now()  # zaten girdisi olanı update etmek..
        # self.slug = self.get_slug()
        return super(Kategori, self).save(*args, **kwargs)
"""
class UrunOzellik(models.Model):
    urun_adi = models.CharField(max_length=50, verbose_name="ürün adı")
    alis_fiyati = models.FloatField(default=1)
    satis_fiyati = models.FloatField(default=1)

    barkodu = models.IntegerField(default=1)

    skt = models.DateTimeField()

    mevcut_adet = models.IntegerField(default=1)

    draft = models.BooleanField(default=False)

    created = models.DateTimeField(editable=False)
    modified = models.DateTimeField()

    slug = models.SlugField(max_length=150)

    def get_slug(self):

        slug = slugify(self.urun_adi.replace("ı", "i"))
        # bolge isimlerinde ı ları i yaparak bolge ismine göre slug atar..
        unique = slug
        number = 1

        while UrunOzellik.objects.filter(slug=unique).exists():
            unique = '{}-{}'.format(slug, number)
            # eğer aynı bolge girişi varsa yanına 1 ekleyecek devam edecek

            number += 1
        return unique
    def __str__(self):
        return self.urun_adi

    def save(self, *args, **kwargs):
        if not self.id:  # eğer girdi varsa oluşturmuyor modified e geçiyor
            self.created = timezone.now()  # eğer girdi yoksa ona göre created date oluşturuyor

        self.modified = timezone.now()  # zaten girdisi olanı update etmek..

        return super(UrunOzellik, self).save(*args, **kwargs)
"""

class Urun(models.Model):
    #user=models.ForeignKey(User,on_delete=models.CASCADE,default=1,blank=True, null=True)

    #yurt = models.ForeignKey(Yurt, on_delete=models.CASCADE, default=1,blank=True, null=True)
    STATUS=(
        ('True','Evet'),
        ('False','Hayır'),
    )
    urun_adi = models.CharField(max_length=50, verbose_name="ürün adı")

    #urun_ozellik = models.ForeignKey(UrunOzellik, on_delete=models.CASCADE, default=1)
    kategori = models.ForeignKey(Kategori, on_delete=models.CASCADE, blank=True, null=True)

    #miktar
    mevcut_adet = models.IntegerField(default=1,blank=True, null=True)

    alis_fiyati = models.FloatField(default=1,blank=True, null=True)

    #price
    satis_fiyati = models.FloatField(default=1,blank=True, null=True)

    barkodu = models.IntegerField(default=1)

    image = models.ImageField(blank=True,null=True,upload_to="media/Market/Ürünler")


    status=models.CharField(max_length=10,choices=STATUS,default=True)

    draft = models.BooleanField(default=False,blank=True, null=True)

    create_at = models.DateTimeField(auto_now_add=True)

    update_at = models.DateTimeField(auto_now=True)

    slug = models.SlugField(unique=True, max_length=150, editable=False)

    #modified_by = models.ForeignKey(User,on_delete=models.SET_NULL,null=True,related_name="modified_by")



    def save(self, *args, **kwargs):
        if not self.id:  # eğer girdi varsa oluşturmuyor modified e geçiyor
            self.create_at = timezone.now()  # eğer girdi yoksa ona göre created date oluşturuyor

        self.update_at = timezone.now()  # zaten girdisi olanı update etmek..
        self.slug = self.get_slug()
        return super(Urun, self).save(*args, **kwargs)

    def __str__(self):
        return self.urun_adi

    def get_slug(self):
        if self.urun_adi is None:
            return None

        slug = slugify(self.urun_adi)
        # ürün isimlerinde ı ları i yaparak bolge ismine göre slug atar..
        unique = slug
        number = 1

        while Urun.objects.filter(slug=unique).exists():
            unique = '{}-{}'.format(slug, number)
            # eğer aynı ürün girişi varsa yanına 1 ekleyecek devam edecek
            number += 1
        return unique

class ImageUrun(models.Model):
    urun = models.ForeignKey(Urun,on_delete=models.CASCADE)
    title=models.CharField(max_length=50)
    image = models.ImageField(blank=True,null=True,upload_to="media/Market/Ürünler")

    def __str__(self):
        return self.title

class UrunAlis(models.Model):
    urun = models.ForeignKey(Urun, on_delete=models.CASCADE, default=1)

    adet = models.IntegerField()

    user = models.ForeignKey(User, on_delete=models.CASCADE, default=1)

    draft = models.BooleanField(default=False)

    created = models.DateTimeField(editable=False)
    modified = models.DateTimeField()


    def save(self, *args, **kwargs):
        if not self.id:  # eğer girdi varsa oluşturmuyor modified e geçiyor
            self.created = timezone.now()  # eğer girdi yoksa ona göre created date oluşturuyor

        self.modified = timezone.now()  # zaten girdisi olanı update etmek..

        return super(UrunAlis, self).save(*args, **kwargs)

    def __str__(self):
        return self.urun.urun_adi


class UrunSatis(models.Model):

    alinanUrun = models.CharField(max_length=50,null=True,blank=True,default='deneme')

    odenecek_miktar=models.IntegerField(blank=True,null=True,default=0)

    user = models.CharField(max_length=50,null=True,blank=True,default='denemeUser')





    """def save(self, *args, **kwargs):
        if not self.id:  # eğer girdi varsa oluşturmuyor modified e geçiyor
            self.created = timezone.now()  # eğer girdi yoksa ona göre created date oluşturuyor

        self.modified = timezone.now()  # zaten girdisi olanı update etmek..

        return super(ImageUrun, self).save(*args, **kwargs)"""

那是我的问题

标签: pythondjango-rest-frameworkpythonanywhere

解决方案


如果您有同样的问题,您可以尝试在 PythonAnyWhere 中修复您的静态文件路径。

静态文件路径应该是..

我解决了我的问题,PythonAnyWhere 无法加载静态/css 文件。并且在同一页面中有 2 个选项,JSON 格式和 HTML 格式,当我尝试编写 JSON 格式时,Html 格式为空,并且 Django 说“该字段需要" 当我修复我的 css 文件路径时,JSON 格式和 HTML 格式不在同一页面中。这就是我对这个问题的解决方案,我在 PythonAnyWhere 中修复了我的 DRF 静态文件路径。


推荐阅读