Я пытался реализовать этот метод несколькими способами, в которых кажется, что он должен быть довольно простым. У меня есть веб-скребок, который собирает данные о запасах и сохраняет их в словаре Python в сценарии python. Затем он отправляет запрос на мой Django API, который обрабатывается в моих представлениях с использованием GenericAPIView
. Этот почтовый запрос отправляет QueryDict
, и я могу опубликовать один экземпляр, но не несколько одновременно.
Да, я установил many=True
на моем сериализаторе и попытался переопределить эти методы. Каждое решение, которое я принял, неэффективно, и я разочарован тем, что не нашел ясного и простого решения. Я впервые работаю с Django Rest Framework, так что будьте терпеливы и заранее благодарим вас за вашу помощь!
CryptoView (в основном следовал учебному пособию на Medium.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
Cryptotest.py
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 (тестировал с инициалом, принимающим много)
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"},
Еще раз спасибо за помощь, он очень ценится. как я рад продолжать совершенствовать этот проект!
UPDATE (2): В соответствии с запросом, здесь приведены точные данные JSON, переданные в сериализатор методом create()
. Это не все данные, но это точный формат [{"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)
в моем сериализаторе. Все, что возвращается, это {}
. Вот моя модель Crypto 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