Тест Django: Residence() получил неожиданный аргумент ключевого слова 'hotel_id'
class Hotel (models.Model):
name = models.CharField()
country = models.CharField()
city = models.CharField()
street = models.CharField()
class Residence(models.Model):
hotel_id = models.ForeignKey(Hotel, on_delete=models.DO_NOTHING, related_name='hotel')
house_number = models.CharField()
Я хочу объединить две модели (Hotel и Residence) и затем опубликовать их. Я написал следующий код:
serializers.py
class HotelSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Hotel
fields = ['name', 'country', 'city', 'street']
class ResidenceSerializer(serializers.HyperlinkedModelSerializer):
hotel_id = HotelSerializer()
class Meta:
model = Residence
fields = ['house_number', 'hotel_id']
def create(self, validated_data):
return Residence.objects.create(**validated_data)
views.py
class ResidenceViewSet(viewsets.ModelViewSet):
serializer_class = ResidenceSerializer
queryset = Residence.objects.all()
Когда я пытаюсь опубликовать данные в своем api, я получаю следующую ошибку: Residence() получил неожиданный аргумент ключевого слова 'hotel_id'. Кто-нибудь может мне помочь?
Замена hotel_id
на hotel
. И все же, вы можете передать отель из вида
class ResidenceSerializer(serializers.HyperlinkedModelSerializer):
hotel = HotelSerializer()
class Meta:
model = Residence
fields = ['house_number', 'hotel']
Also if you are not interested in hyper links(urls) then replace
`serializers.HyperlinkedModelSerializer` with `serializers.ModelSerializer`.
Разница между HyperlinkedModelSerializer
и ModelSerializer
является сериализатором размещено здесь Serjik
Простой пример:
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ('url', 'username', 'email', 'groups')
class GroupSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Group
fields = ('url', 'name')
bash> http -a admin:yourpassword http://127.0.0.1:8000/users/
"results": [
{
"email": "admin@min.com",
"groups": [
"http://127.0.0.1:8000/groups/1/",
"http://127.0.0.1:8000/groups/2/"
],
"url": "http://127.0.0.1:8000/users/1/",
"username": "admin"
}
]
Но если вы измените
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('url', 'username', 'email', 'groups')
Результатом будет:
"results": [
{
"email": "admin@min.com",
"groups": [
1,
2
],
"url": "http://127.0.0.1:8000/users/1/",
"username": "admin"
}
]