Как решить проблему "поле должно быть уникальным" в django?
Я создаю приложение с vue и django, но столкнулся с проблемой получения информации из сериализатора. мои модели выглядят следующим образом:
models.py
from django.contrib.auth.models import User
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
class Order(models.Model):
name = models.CharField(max_length=255)
posted_by = models.ForeignKey(Profile, on_delete=models.CASCADE)
class Offer(models.Model):
order_related = models.ForeignKey(Order, on_delete=models.CASCADE, related_name='offers')
author = models.ForeignKey(Profile, on_delete=models.CASCADE)
serializers.py:
class ProfileSerializer(serializers.ModelSerializer):
class Meta:
model = Profile
fields = ("user",)
class OfferSerializer(serializers.ModelSerializer):
author = ProfileSerializer()
class Meta:
model = Offer
fields = ("id", "order_related",
"author",
)
class OrderSerializer(serializers.ModelSerializer):
posted_by = ProfileSerializer()
class Meta:
model = Order
fields = ("id", "posted_by", "name")
views.py:
class OfferView(ListModelMixin, GenericAPIView, CreateModelMixin):
queryset = Offer.objects.all()
serializer_class = OfferSerializer
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
когда я посылаю информацию этому представлению:
const formData = {
order_related: this.$route.params.order_id,
author: {user: localStorage.getItem("user")},
}
axios
.post("api/v1/offers/", formData)
я получаю ошибку:
{"user":["Values of field must be unique."]}
Есть ли способ переопределить это?
P.S. Написать модель AbstactUser и т.д. - не способ
Посылать еще один запрос, чтобы получить по id подробную информацию, тоже не лучший вариант
Класс профиля, имеющий только 1 поле OneToOneField, выглядит избыточным.
Вы можете просто работать над классом User.
Как насчет:
- views.py
from rest_framework.exceptions import ValidationError
from rest_framework.response import Response
class OfferView(ListModelMixin, GenericAPIView):
queryset = Offer.objects.all()
serializer_class = OfferSerializer
def post(self, request, *args, **kwargs):
data = request.data
order_id = data.get('order_related')
user_id = data.get('author', {}).get('user')
try:
order_id = int(order_id)
user_id = int(user_id)
except (TypeError, ValueError):
raise ValidationError(f'Invalid post data: {order_id=};{user_id=}')
profile = Profile.objects.get(user_id=user_id)
order = Order.objects.get(id=order_id)
obj = self.queryset.create(order_related=order, author=profile)
return Response(self.serializer_class(obj).data)