モデルはUser
モデルとPresent
モデルで構成されています。 User
は、複数のPresent
を持つことができますが、Present
はユニークUser
ありますPrimaryKeyRelatedFieldを別のフィールドに置き換えます
マイmodels.py
は次のとおりです。
from django.db import models
from django.contrib.auth.models import User
class Present(models.Model):
name = models.CharField(max_length=15)
price = models.FloatField()
link = models.CharField(max_length=15)
isAlreadyBought = models.BooleanField()
user = models.ForeignKey(User, related_name='presents', on_delete=models.CASCADE)
マイserializers.py
です:
from django.contrib.auth.models import User, Group
from rest_framework import serializers
from blog.models import Present, Location
from django.contrib.auth.models import User
class UserSerializer(serializers.ModelSerializer):
presents = serializers.PrimaryKeyRelatedField(many=True, queryset=Present.objects.all(), required=False)
class Meta:
model = User
fields = ('username', 'password', 'email', 'presents')
def create(self, validated_data):
user = super().create(validated_data)
if 'password' in validated_data:
user.set_password(validated_data['password'])
user.save()
return user
class PresentSerializer(serializers.ModelSerializer):
user = serializers.PrimaryKeyRelatedField(queryset=User.objects.all(), read_only=False, many=False)
class Meta:
model = Present
fields = ('name', 'link', 'price', 'isAlreadyBought', 'user')
def create(self, validated_data):
return Present.objects.create(**validated_data)
現在、私はすべて取得したい場合私は主キー(views.py
)を使用します:
しかし、私はむしろUser
のusername
フィールドをプライマリキーの代わりに使用します。
私はSlugRelatedField
を使用して試してみましたが、私はこれが私の目標を達成するための正しい方法であることを確認していない:
class PresentSerializer(serializers.ModelSerializer):
user = serializers.SlugRelatedField(queryset=User.objects.all(), slug_field='username', read_only=False, many=False)
class Meta:
model = Present
fields = ('name', 'link', 'price', 'isAlreadyBought', 'user')
def create(self, validated_data):
return Present.objects.create(**validated_data)
そして、この変更で、私は今、そのid
ユーザー'Marcel'
を取得するには、次のView
を使用します
class PresentsOfUser(viewsets.ModelViewSet):
queryset = Present.objects.all().filter(user='Marcel')
serializer_class = PresentSerializer
しかし、この場合には、私が手::33
ある
ValueError: invalid literal for int() with base 10: 'Marcel'
しかし、私は(以前と)user=33
によってuser='Marcel'
を交換する場合は、私が取得:ユーザーフィールドは今username
はなく、ユーザーのid
ある
[{"name":"Nintendo","link":"fake_link","price":50.8,"isAlreadyBought":true,"user":"Marcel"},{"name":"Gamecube","link":"fake_link","price":50.8,"isAlreadyBought":true,"user":"Marcel"}]
。
user='Marcel'
とフィルタリングが失敗した理由しかし、私は...
現在のシリアライザのフィールドで '' user__username''を試しましたか? – Brobin
詳細を教えてください。 – floflo29