'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 |
