我在網上搜索并發現了類似的問題,但在我的情況下它不起作用,Idk 為什么。我嘗試將一些額外的資料context放入序列化程式中,但只獲得 3 個默認欄位:request,view并且format沒有提及我的自定義資料。
我的模型:
class Match(models.Model):
sender = models.ForeignKey(
Client,
on_delete=models.CASCADE,
related_name='senders'
)
recipient = models.ForeignKey(
Client,
on_delete=models.CASCADE,
related_name='recipients'
)
class Meta:
app_label = 'clients'
db_table = 'matches'
verbose_name = 'match'
verbose_name_plural = 'matches'
constraints = [
models.UniqueConstraint(
fields=['sender', 'recipient'],
name='unique_match'
)
]
我的序列化器:
class MatchSerializer(serializers.ModelSerializer):
sender = serializers.HiddenField(default=serializers.CurrentUserDefault())
def validate(self, data):
if data['sender'] == self.context['recipient']:
raise serializers.ValidationError('You cannot match yourself')
return data
def create(self, validated_data):
return Match.objects.create(
sender=validated_data['sender'],
recipient=self.context['recipient']
)
class Meta:
model = Match
fields = ['sender']`
我的模型視圖集:
class MatchMVS(ModelViewSet):
queryset = Match.objects.all()
serializer_class = MatchSerializer
http_method_names = ['post']
permission_classes = [IsAuthenticated]
# without and with doesn't work
def get_serializer_context(self):
context = super(MatchMVS, self).get_serializer_context()
context.update({
"recipient": Client.objects.get(pk=23)
# extra data
})
return context
@action(detail=True, methods=['POST'], name='send_your_match')
def match(self, request, pk=None):
sender = request.user
recipient = Client.objects.get(pk=pk)
serializer = MatchSerializer(context={'request': request, 'recipient': recipient},
data=request.data)
data_valid = serializer.is_valid(raise_exception=True)
if data_valid:
recipient = serializer.save()
is_match = Match.objects.filter(sender=recipient, recipient=sender).exists()
if is_match:
send_mail(
f'Hello, {sender.first_name}',
f'You got match with {recipient.first_name}! '
f'Your`s partner email: {recipient.email}',
settings.EMAIL_HOST_USER,
[sender.email],
fail_silently=False,
)
send_mail(
f'Hello, {recipient.first_name}',
f'You got match with {sender.first_name}! '
f'Your`s partner email: {sender.email}',
settings.EMAIL_HOST_USER,
[recipient.email],
fail_silently=False,
)
return Response(recipient.email, 201)
else:
return Response(f'Your sympathy has been sent to {recipient.username}.', 201)
我正在通過 PyCharm 和 Postman 除錯它,但仍然不明白我的錯誤在哪里。希望你能幫我解決它。
uj5u.com熱心網友回復:
您的代碼是正確的。它應該可以作業。但我不知道問題出在哪里。您可以嘗試修改后的代碼,如下所示。
class MatchSerializer(serializers.ModelSerializer):
def validate(self, data):
if data['sender'] == data['recipient']:
raise serializers.ValidationError('You cannot match yourself')
return data
class Meta:
model = Match
fields = ['sender', 'recipient']
class MatchMVS(ModelViewSet):
queryset = Match.objects.all()
serializer_class = MatchSerializer
http_method_names = ['post']
permission_classes = [IsAuthenticated]
@action(detail=True, methods=['POST'], name='send_your_match')
def match(self, request, pk=None):
sender = request.user
recipient = Client.objects.get(pk=pk)
serializer = MatchSerializer(data={**request.data, 'recipient': recipient.id})
data_valid = serializer.is_valid(raise_exception=True)
if data_valid:
recipient = serializer.save()
is_match = Match.objects.filter(sender=recipient, recipient=sender).exists()
if is_match:
send_mail(
f'Hello, {sender.first_name}',
f'You got match with {recipient.first_name}! '
f'Your`s partner email: {recipient.email}',
settings.EMAIL_HOST_USER,
[sender.email],
fail_silently=False,
)
send_mail(
f'Hello, {recipient.first_name}',
f'You got match with {sender.first_name}! '
f'Your`s partner email: {sender.email}',
settings.EMAIL_HOST_USER,
[recipient.email],
fail_silently=False,
)
return Response(recipient.email, 201)
else:
return Response(f'Your sympathy has been sent to {recipient.username}.', 201)
uj5u.com熱心網友回復:
問題是我自己的疏忽,錯誤的視圖集鏈接到了 url
urlpatterns = [
path('clients/<int:pk>/match', views.MatchCreateAPIView.as_view(), name='get_match')
]
代替:
urlpatterns = [
path('clients/<int:pk>/match', views.MatchMVS.as_view({'post': 'match'}), name='get_match')
]
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/451332.html
標籤:Python django 序列化 django-rest-framework django-rest-viewsets
上一篇:在Django中洗掉物件
下一篇:為什么我的Flask應用程式因ImportError崩潰:無法從“jinja2”匯入名稱“contextfunction”
