Skip to content

Commit 1129a8d

Browse files
author
Benjamin Schäfer
committed
Detect underlying field for OneToOne primary key
1 parent efc7c1d commit 1129a8d

File tree

2 files changed

+22
-0
lines changed

2 files changed

+22
-0
lines changed

rest_framework/serializers.py

+4
Original file line numberDiff line numberDiff line change
@@ -1234,6 +1234,10 @@ def build_standard_field(self, field_name, model_field):
12341234
if model_field.one_to_one and model_field.primary_key:
12351235
field_class = self.serializer_related_field
12361236
field_kwargs['queryset'] = model_field.related_model.objects
1237+
pk_field = field_mapping[model_field.foreign_related_fields[0]]
1238+
pk_field_kwargs = get_field_kwargs(field_name, model_field.foreign_related_fields[0])
1239+
pk_field_kwargs.pop("model_field")
1240+
field_kwargs["pk_field"] = pk_field(**pk_field_kwargs)
12371241

12381242
if 'choices' in field_kwargs:
12391243
# Fields with choices get coerced into `ChoiceField`

tests/test_serializer.py

+18
Original file line numberDiff line numberDiff line change
@@ -762,3 +762,21 @@ class TestSerializer(serializers.Serializer):
762762

763763
assert (s.data | {}).__class__ == s.data.__class__
764764
assert ({} | s.data).__class__ == s.data.__class__
765+
766+
767+
class TestRelatedFieldTypes:
768+
769+
def test_one_to_one_field(self):
770+
class MyModelA(models.Model):
771+
id = models.DecimalField(max_digits=4, decimal_places=2, primary_key=True)
772+
773+
class MyModelB(models.Model):
774+
id = models.OneToOneField(MyModelA, models.CASCADE, primary_key=True)
775+
776+
class MyModelBSerializer(serializers.ModelSerializer):
777+
class Meta:
778+
model = MyModelB
779+
fields = "__all__"
780+
781+
ser = MyModelBSerializer()
782+
assert type(ser.fields["id"].pk_field) == fields.DecimalField

0 commit comments

Comments
 (0)