#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
эта таблица является уникальным полем, а также является ограничением для этой таблицы.