Как создать представление и сериализатор для добавления поля "многие ко многим" в 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.