Много к много пост запрос DRF
В настоящее время я пытаюсь понять, как должен быть структурирован почтовый запрос, чтобы создать объект в watchlist.
Мой models.py содержит две модели, которые связаны между собой через stock.
class Stock(models.Model):
model_number = models.CharField(max_length=100, unique=True, default="")
model = models.CharField(max_length=100)
brand = models.CharField(max_length=100)
msrp = models.IntegerField(default=0)
class Watchlist(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
stock = models.ManyToManyField(Stock)
Это создало две таблицы в моей базе данных, одна из которых называется watchlist, а другая - watchlist_stock. Первая содержит id и id пользователя. Вторая содержит id, watchlist_id и stock_id.
<
class WatchlistAddSerializer(serializers.ModelSerializer):
class Meta:
model = Watchlist
fields = ['stock']
А вот соответствующее представление для метода post.
@api_view(['POST'])
def watchlist_create(request):
serializer = WatchlistAddSerializer(data=request.data)
if serializer.is_valid():
serializer.save(user=request.user)
return JsonResponse(serializer.data, status=status.HTTP_201_CREATED)
else:
return JsonResponse(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Я использую axios для постинга на react frontend, но сейчас я в растерянности от того, как должны быть структурированы данные для постинга.
реагировать
api.post(`/api/watchlist-create/`, {
// Some data goes here
})
В конце концов я разобрался с этим после некоторого времени поиска похожих проблем.
@api_view(['POST'])
@permission_classes([IsAuthenticated])
def watchlist_create(request, stock_id):
// Get the stock from url
stock = get_object_or_404(Stock, pk=stock_id)
// Check if user has a watchlist and if not create one
user_watchlist, created = Watchlist.objects.get_or_create(user=request.user)
// Add the stock to the users watchlist
user_watchlist.stock.add(stock)
return JsonResponse({'status': 'success'}, status=status.HTTP_200_OK)
const handleAdd = (id) => {
api.post(`/api/watchlist-create/${id}`)
}
Вы можете добавить поле PrimaryKeyRelatedField
[drf-doc] для (де)сериализации запасов:
class WatchlistAddSerializer(serializers.ModelSrialzer):
stock = serializers.PrimaryKeyRelatedField(
many=True, queryset=Stock.objects.all()
)
class Meta:
model = Watchlist
fields = ['tock']
Затем вы перечисляете идентификаторы акций как данные:
api.post(`/api/watchlist-create/`, {
stock: [1, 4, 25] // ids of stock objects
})