Django HyperlinkedModelSerializer на таблице, имеющей поле, помеченное как pk + fk
У меня есть таблица, в которой есть поле, отмеченное как первичный ключ, хотя оно также является внешним ключом. Это не идеально, но в данный момент нужно с этим разобраться.
class Profile(models.Model):
class Meta:
verbose_name_plural = "Profiles"
member = models.OneToOneField(
Member,
on_delete=models.CASCADE,
primary_key=True,
)
...
Теперь у меня есть сериализатор django-rest-framework для моделей Member и Profile, который выглядит следующим образом,
class MemberSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Member
fields = ('id', 'role_id', 'user_id')
class MemberProfileSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Profile
fields = ['member_id','bio','address','mobile']
Вопрос заключается в том, что когда я извлекаю 'member_id' из MemberProfileSerializer, он правильно перечисляет id (это id, который является пк для Profile, и также является пк для таблицы Member)
Но если мне нужно извлечь больше информации из модели Member, и для этого добавить ссылку на MemberSerializer, то в результатах я получаю обратно пустой объект!
class MemberProfileSerializer(serializers.HyperlinkedModelSerializer):
member_id = MemberSerializer()
class Meta:
model = Profile
fields = ['member_id','bio','address','mobile']
Далее, если я добавлю запись HyperlinkedRelatedField для member_id,
class MemberProfileSerializer(serializers.HyperlinkedModelSerializer):
member_id = serializers.HyperlinkedRelatedField(
view_name = 'member-detail',
lookup_field='id',
read_only=True)
class Meta:
model = Profile
fields = ['member_id','bio','address','mobile']
Я получаю следующую ошибку.
" у объекта 'int' нет атрибута 'id'"
По сути, каким-то образом сериализатор вообще не воспринимает это поле как внешний ключ. Есть ли способ принудительно изменить поведение?
На самом деле. Глупый я. Нужно было ссылаться на объект member в профиле, как 'member', а не 'member_id'.
class MemberProfileSerializer(serializers.HyperlinkedModelSerializer):
member = MemberSerializer()
class Meta:
model = Profile
fields = ['member','bio','address','mobile']
Виллем, спасибо за ваши предложения!