'Get empty OrderedDict through Serializer when retrieving

I'm using Django 4.x and Django REST Framework, I have built two models:

class Homepage(models.Model):
    org_name = models.CharField(max_length=20, blank=True)
    org_code = models.CharField(max_length=20, blank=True)
    class Meta:
        ordering = ('org_name',)
    def __str__(self):
        return self.org_name
class MainDiag(models.Model):
    release = models.TextField(max_length=256, blank=True)
    code = models.CharField(max_length=20, blank=True)
    condition = models.CharField(max_length=20, blank=True)
    homepage = models.ForeignKey(Homepage, related_name='main_diag', on_delete=models.CASCADE)

Serializers:

class MainDiagSerializer(serializers.ModelSerializer):
    class Meta:
        model = MainDiag
        fields = (
            'release',
            'code',
            'condition',
        )
class HomepageSerializer(serializers.ModelSerializer):
    main_diag = MainDiagSerializer(many=False)
    class Meta:
        model = Homepage
        fields = (
            "org_name",
            "org_code",
            "main_diag",
        )
    def create(self, validated_data):
        main_diag_data = validated_data.pop('main_diag')
        homepage = Homepage.objects.create(**validated_data)
        MainDiag.objects.create(homepage=homepage, **main_diag_data)
        return homepage

The expected return value at the frontend:

{
    org_name: '',
    org_code: '',
    main_page: {
        release: '',
        code: '',
        condition: '',
    }
}

What I got:

{
    org_name: '',
    org_code: '',
    main_page: {}
}

I can add MainDiags into MySQL successfully, however, when I get Homepages through serializer = HomepageSerializer, the main_page in serializer.data is always an empty OrderedDict(). Is there any issue with my code? How can I get the main_page through serializer.data? Thank you very much!



Solution 1:[1]

As Willem mentioned, I should use OneToOneField since I want a one-to-one relation here.
However, the empty object issue still exists after that. The issue is solved by adding a related_name for the MainDiag model:

homepage = models.ForeignKey(Homepage, \
           related_name='main_diag', \
           on_delete=models.CASCADE)

Hope this would help someone have a similar issue as mine.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Bmo