Много к много пост запрос 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
})
Вернуться на верх