如何使用这个模型结构在DjangoREST框架中创建POST请求

2024-06-16 11:00:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我是django和django rest框架的新手,我正在尝试用POST请求发送对象,但我不知道为什么失败,以下是我的模型:

class Region(models.Model):
id_region = models.AutoField(primary_key=True)
name_region = models.CharField(max_length=255) 

def __str__(self):
    return self.name_region


class DataTicker(models.Model):
id_data_ticker = models.AutoField(primary_key=True)
ytd = models.FloatField()
expense_ratio = models.FloatField()
price_earnings_ratio = models.FloatField()
price_book_ratio = models.FloatField()
aum_ticker = models.FloatField()
price = models.FloatField()
nav = models.FloatField()
bid_ask = models.FloatField()
premiun_discount = models.FloatField()
date= models.DateTimeField(auto_now=False)
region_id_fk = models.ForeignKey(Region,on_delete=models.CASCADE)
geography_id_fk = models.ForeignKey(Geography,on_delete=models.CASCADE)

def __str__(self):
    return str(self.id_data_ticker)


class Ticker(models.Model):
id_number = models.AutoField(primary_key=True)
ticker_id = models.CharField(max_length=100)
index_tracked = models.CharField(max_length=255)
fund = models.CharField(max_length=255)
focus = models.CharField(max_length=255)
inception_date= models.DateTimeField(auto_now=False)
asset_id_fk = models.ForeignKey(AssetClass,on_delete=models.CASCADE)
data_tickers = models.ManyToManyField(DataTicker)

def __str__(self):
    return self.ticker_id

这是我的序列化程序

class RegionSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
    model = Region
    fields = ('id_region','name_region','geography_id_fk')

class DataTickerSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
    model = DataTicker
    fields = ('id_data_ticker','ytd','expense_ratio','price_earnings_ratio',
    'price_book_ratio','aum_ticker','price','nav','bid_ask','premiun_discount','date','region_id_fk','geography_id_fk')

region_id_fk =  serializers.SerializerMethodField('get_region_id_fk')
geography_id_fk =  serializers.SerializerMethodField('get_geography_id_fk')

def get_region_id_fk(self,obj):
    return obj.region_id_fk.name_region

def get_geography_id_fk(self,obj):
    return obj.geography_id_fk.name_geography

class TickerSerializer(serializers.ModelSerializer): 
#data_tickers = serializers.PrimaryKeyRelatedField(queryset=DataTicker.objects.all(), many=True)
data_tickers = DataTickerSerializer(many=True, read_only=True)

class Meta:
    model = Ticker
    fields = ('id_number','ticker_id','index_tracked','fund',
    'focus','inception_date',
    'asset_id_fk','data_tickers')

asset_id_fk =  serializers.SerializerMethodField('get_asset_id_fk') 

def get_asset_id_fk(self,obj):
    return obj.asset_id_fk.name_asset

我的观点:

class RegionSViewSet(viewsets.ModelViewSet):
queryset = Region.objects.all().order_by('id_region')
serializer_class = RegionSerializer


class TickerViewSet(viewsets.ModelViewSet):
queryset = Ticker.objects.all().order_by('id_number')
serializer_class = TickerSerializer

class DataTicketViewSet(viewsets.ModelViewSet):
queryset = DataTicker.objects.all().order_by('id_data_ticker')
serializer_class = DataTickerSerializer

这就是我要发送的对象:

var对象={ “ticker\u id”:“测试”, “index_tracked”:“测试”, “fund”:“测试”, “focus”:“测试”, “起始日期”:“2019-11-19T19:28:16Z”, “资产标识”:6, “数据标签”:[{ “id\u data\u ticker”:1, “本年迄今”:0.126504, “费用比率”:25.0, “市盈率”:20.257181, “市盈率”:2.345986, “奥姆股票代码”:25290400.0, “价格”:10000.0, “导航”:11000.0, “招投标”:15000.0, “溢价折扣”:2000.0, “日期”:“2019-11-01T19:23:03Z”, “region\u id\u fk”:“欧洲”, “geography\u id\u fk”:“发达欧洲” }] }你知道吗

我做错了什么? 谢谢!你知道吗


Tags: nameselfidtruedatamodelsdefasset
1条回答
网友
1楼 · 发布于 2024-06-16 11:00:38

在视图中,必须添加一个方法调用post 参见示例https://www.django-rest-framework.org/tutorial/3-class-based-views/

class TickerList(APIView):

    def post(self, request, format=None):
        serializer = TickerSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)```

相关问题 更多 >