Как удалить запись fk в Django Rest Framework

#django #django-rest-framework

#django #django-rest-framework

Вопрос:

Моя цель — удалить запись fk, связанную с записью с заданным идентификатором в конечной точке.

мой URL

 path('car-pricing/<uuid:car_id>/', car_pricing),
  

моя модель

 class Pricing(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    car = models.ForeignKey(Car, related_name="pricings", on_delete=models.CASCADE)
  

Другими словами, я хочу удалить определенную Pricing запись с учетом идентификатора Car в моей конечной точке.

Запрашивая идентификатор Car записи, я могу получить более одной Pricing записи.

Возможно ли каким-либо образом удалить определенную Pricing запись на основе идентификатора?

мое мнение (здесь я не знаю, как справиться с функцией удаления)

 elif request.method == 'DELETE':
        pricing_data = request.data

        return Response(status=status.HTTP_204_NO_CONTENT)
  

Здесь запрошенные данные представляют собой пустой запрос, и это нормально, поскольку в django rest framework нет способа передать запрошенные данные для действия удаления

Комментарии:

1. КАСКАД выполнит всю работу.

2. @IvanStarostin пожалуйста, не могли бы вы быть более конкретным?

3. on_delete=models.CASCADE при удалении car все связанные цены также будут удалены.

4. Я знаю это, и я это реализовал, посмотрите на мою часть модели. Я хочу удалить запись о ценах, а не запись об автомобиле

5. Таким образом, нет смысла отправлять запросы с car_id. Если только вы не знаете, как выбрать конкретную цену из многих (и это все еще имеет смысл с точки зрения бизнес-логики).

Ответ №1:

Когда вы хотите удалить определенный объект, у вас должен быть определенный фильтр, который вернет только один объект. Насколько я вижу, у вас есть one to many связь между Car и Pricing моделями, поэтому вы не можете удалить конкретную цену, отфильтровав только car поле (потому что car может быть подключен к нескольким объектам ценообразования). Когда вы хотите удалить определенную строку из таблицы с помощью некоторых фильтров, у вас должно быть ограничение для этой таблицы и этих фильтров, чтобы возвращать только одну строку. Однако вы можете удалить записи о ценах с помощью Pricing.object.filter(car_id=car_id).delete() , но в этом случае вы удалите все объекты ценообразования, связанные с этим автомобилем. Если вы измените path('car-pricing/<uuid:car_id>/', car_pricing), на path('car-pricing/<uuid:car_id>/<int:pk>/', car_pricing) , вы можете удалить конкретную запись, отфильтровав как Pricing.objects.filter(pk=pk, car_id=car_id).delete() или просто используя path('car-pricing/<int:pk>/', car_pricing) и Pricing.objects.filter(pk=pk).delete() вы можете удалить конкретный объект ценообразования, потому что pk эта таблица является уникальным полем, а также является ограничением для этой таблицы.