Аннотация x конфликтует с полем в модели
Я хочу удалить/заменить некоторые свойства из вызова list() при вызове Django rest framework.
Например, у меня есть ip_address
в таблице db, также добавляется ip_address
при вызове perform_create(), но оно не должно отображаться/включаться при вызове list() и retrieve().
При повторных вызовах я могу сделать это, просто переопределив метод, добавив instance.ip_address = None
.
Но теперь у меня проблема - при вызове list() мне нужно изменить свойства объекта queryset.
Я попробовал следующее,
o = ThreadedComment.objects.all()
o.annotate(ip_address=Value('', output_field=CharField())).all()
но я получил ошибку:
The annotation 'ip_address' conflicts with a field on the model.
Есть ли способ удалить/переопределить/заменить правильно на queryset в Django? Спасибо
Как я понял из вашего вопроса, в одном из ваших представлений, для методов list()
и retrive()
, вы хотите, чтобы ip_address
не отображался или не был в ответе по какой-либо причине. Если я правильно понимаю, для этого у вас есть много решений, одно из которых - удаление поля из набора запросов по имени этого поля:
fields_to_display = [field.name for field in ThreadedComment._meta.get_fields()]
fields_to_display.remove('ip_address')
qs = ThreadedComment.object.all().values(*fields_to_display)
На данный момент я использую это обходное решение. В любом случае, это работает для меня, но я не уверен, что это лучшее, что я могу сделать. Пожалуйста, подскажите мне любые советы или подсказки, если у вас они есть.
def to_representation(self, instance):
ret = super().to_representation(instance)
if self.context["request"].method == "GET": ret.pop("ip_address")
return ret