Как создать представление и сериализатор для добавления поля "многие ко многим" в DRF

Я реализовал две модели, Card и Dish. Я использовал отношения многие-ко-многим, потому что блюдо может быть во многих карточках. Кроме того, я бился и не мог нигде найти ответ, как обновить созданную карточку с блюдом. Или создать карточку с блюдами в ней. Должен ли я попытаться создать средний файл с идентификаторами карты и блюда или есть какой-то другой способ сделать это в DRF? Я бьюсь над этим уже некоторое время и буду очень признателен за совет. Вот код:



class Dish(models.Model):
    name = models.CharField(max_length=255, unique=True)
    description = models.TextField(max_length=1000)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    preparation_time = models.IntegerField()
    date_added = models.DateField(auto_now_add=True)
    update_date = models.DateField(auto_now=True)
    vegan = models.BooleanField(default=False)

    def __str__(self):
        return self.name


class Card(models.Model):
    name = models.CharField(max_length=255, unique=True)
    description = models.TextField(max_length=1000)
    date_added = models.DateField(auto_now_add=True)
    update_date = models.DateField(auto_now=True)
    dishes = models.ManyToManyField(Dish, blank=True)

    def __str__(self):
        return self.name



class DishSerializer(serializers.ModelSerializer):


    class Meta:
        model = Dish
        fields = ['id', 'name', 'description', 'price', 'how_long_to_prepare', 'date_added', 'update_date', 'vegan']
        read_only_fields = ['id']


class CardSerializer(serializers.ModelSerializer):
    class Meta:
        model = Card
        fields = ['id', 'name', 'description', 'date_added', 'update_date', 'dishes']
        read_only_fields = ['id']

class CreateCardView(generics.CreateAPIView):
    """Create a new user in the system."""
    serializer_class = serializers.CardSerializer


class AddToCardView(generics.CreateAPIView):
    serializer_class = serializers.CustomUserSerializer

Вы можете использовать метод perfom_create.

например, в CreateView сразу после сериализатора добавьте следующее :

def perform_create(self, serializer):
    dish = Dish.objects.get(pk=self.kwargs['pk']) 
    serializer.save(dish=dish, author=self.request.user)

Из документации :

Например, вы можете установить атрибут для объекта на основе пользователя запроса или на основе аргумента ключевого слова URL.

Вернуться на верх