我一直在尝试以几种方式实现这个方法,看起来应该非常简单。我有一个web刮板,它可以刮取股票数据并将其存储到Python脚本中的Python字典中。然后向我的Django API发出post请求,该请求在我的视图下使用GenericAPIView
进行处理。这个post请求发送一个QueryDict
,我可以发布一个实例,但不能同时发布多个实例
是的,我已经在序列化程序上设置了many=True
,并试图重写这些方法。我所做的每一个解决方案都是低效的,我很沮丧没有找到一个清晰简单的解决方案。这是我第一次使用Django Rest框架,请耐心等待,并提前感谢您的帮助
CryptoView(主要遵循media.com上的教程来改进我的方法)
class CryptoView(ListCreateAPIView):
queryset = Crypto.objects.all()
serializer_class = CryptoSerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
class SingleCryptoView(RetrieveUpdateDestroyAPIView):
queryset = Crypto.objects.all()
serializer_class = CryptoSerializer
加密测试
crypto = []
# For Loop - Yahoo Finance requires us to crawl through specific
# attributes to find data
for listing in soup.find_all('tr', attrs={'class':'simpTblRow'}):
listing_dict = {}
for name in listing.find_all('td', attrs={'aria-label':'Name'}):
listing_dict["name"] = name.text
for price in listing.find_all('td', attrs={'aria-label':'Price (Intraday)'}):
listing_dict["price"] = price.text.replace(',', '')
for change in listing.find_all('td', attrs={'aria-label':'Change'}):
listing_dict["change"] = change.text
for percentChange in listing.find_all('td', attrs={'aria-label':'% Change'}):
listing_dict["percentChange"] = percentChange.text.replace('%', '')
index += 1
crypto.append(listing_dict)
headers = {'Content-type': 'application/json'}
requests.post(url=API_ENDPOINT, json=json.dumps(crypto), headers=headers)
CryptoSerializer(正在使用init进行测试,接受多个)
class CryptoSerializer(serializers.ModelSerializer):
def __init__(self, *args, **kwargs):
many = kwargs.pop('many', True)
super(CryptoSerializer, self).__init__(many=many, *args, **kwargs)
class Meta:
model = Crypto
fields = ('name', 'price', 'change', 'percentChange')
def create(self, validated_data):
return Crypto.objects.create(**validated_data)
def update(self, instance, validated_data):
instance.name = validated_data.get('name', instance.name)
instance.price = validated_data.get('price', instance.price)
instance.change = validated_data.get('change', instance.change)
instance.volume = validated_data.get('percentChange', instance.volume)
instance.save()
return instance
更新:
能够将数据作为JSON数组发送到post方法。现在从序列化程序中获取Bad Request
错误,该序列化程序在serializer.is_valid()
检查中失败。如果我删除了raise_exception=True
,那么我的create()就不会传入任何数据。这就是我的JSON数组的格式,如果它是正确的,我不知道:[{"id": 0, "name": "Bitcoin USD", "price": "5314.87", "change": "+54.02", "percentChange": "+1.03"},
再次感谢您的帮助,非常感谢,因为我很高兴能继续改进这个项目
更新(2):
根据请求,下面是使用create()
方法传递给序列化程序的确切JSON数据。这不是所有的数据,但它是精确的格式[{"id": 107, "name": "FirstCoin USD", "price": "0.0017", "change": "-0.0012", "percentChange": "-41.52"}, {"id": 108, "name": "MCAP USD", "price": "0.0046", "change": "0.0000", "percentChange": "0.00"}, {"id": 109, "name": "ATBCoin USD", "price": "0.0011", "change": "+0.0002", "percentChange": "+17.10"}, {"id": 110, "name": "Exchange Union USD", "price": "0.6857", "change": "+0.0026", "percentChange": "+0.38"}]Bad Request: /crypto/
尝试在我的序列化程序中print(request.data)
时,此数据不存在。所有返回的都是{}
。这是我的加密模型
Models.py
# Template Model
class Crypto(models.Model):
name = models.CharField(max_length=30) # Name of the stock
price = models.FloatField() # Opening stock price
change = models.FloatField() # Closing stock price
percentChange = models.FloatField() # Amount of sales
def __str__(self):
return self.name
好的,首先读this example to know more about creating multiple at once.
您的问题只是传递给post的格式
在JSON中,当您传递多个对象时,我们预期会出现类似的情况
如您所见,它是一个JSON数组
在DRF中,当您创建一个序列化程序时,您需要编写一些东西来将JSON转换为一个模型实例,反之亦然。因此,当我们有多个对象时,比如上面的示例,并且我们想对其执行任何操作,我们将关键字
many=True
添加到序列化程序中,以便它知道传递的数据有多个对象,而不仅仅是一个对象,所以它会在其上循环并为每个对象进行转换让我们回到您创建的数据:
这是一个字典,每个键都有一个数组,您现在可以看到为什么它根本不工作,因为它与序列化程序所期望的不匹配
当然,如果这是您想要传递的格式,我们可以在序列化程序上工作,编写一些代码并更改其字段,以便它处理它,但我觉得最好将数据构造为JSON数组并传递它
您可以使用
zip()
同时在两个或多个列表上循环,这样您就可以一次创建完整的对象,或者您想要的任何东西—方法太多了更新: 作为建议,制作字典数组最简单的方法是
注意:我假设每个孩子
for loop
只跑一次,因为它是一行,因为我不是汤专家,所以我会让你处理这个问题然后您可以传递数据或使用
json.dump()
或其他任何东西,现在就可以使用了更新2: 对循环中的每个dict应用
json.dump()
,然后再对数组应用它然后
data=json.dump(stocks)
相关问题 更多 >
编程相关推荐