doableware / djongo

Django and MongoDB database connector
https://www.djongomapper.com
GNU Affero General Public License v3.0
1.86k stars 352 forks source link

[Question] How to serialize and flatten embeddedField before save? #643

Open scheung38 opened 1 year ago

scheung38 commented 1 year ago

Sample output is shown:

Screenshot 2022-10-02 at 13 19 55

In this example I would like to flatten 'locality' Object before saving

serializer.py

class LocalitySerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = Locality
        fields = ('_id', 'locality_key', 'filler1', 'filler2', 'post_town', 'dependent_locality', 'double_dependent_locality')    

class AddressSerializer(serializers.HyperlinkedModelSerializer):

    locality = LocalitySerializer()
    locality_id = serializers.Field(source='locality._id')
    locality_locality_key = serializers.Field(source='locality.locality_key')
    locality_filler1 = serializers.Field(source='locality.filler1')
    locality_filler2 = serializers.Field(source='locality.filler2')
    locality_post_town = serializers.Field(source='locality.post_town')
    locality_dependent_locality = serializers.Field(source='locality.dependent_locality')
    locality_double_dependent_locality= serializers.Field(source='locality.double_dependent_locality')

    class Meta:
    model = Address
    fields = ('outward_code', 'inward_code', 'locality')

model.py

from djongo import models

class Locality(models.Model):
    _id = models.ObjectIdField()
    locality_key = models.PositiveIntegerField(unique=True, help_text="The Locality Key")
    filler1 = models.CharField(max_length=30, blank=True, help_text="First Filler")
    filler2 = models.CharField(max_length=15, blank=True, help_text="Second Filler")
    post_town = models.CharField(max_length=30, blank=True, help_text="post town")
    dependent_locality = models.CharField(
        max_length=35, blank=True, help_text="Dependent Locality"
    )
    double_dependent_locality = models.CharField(
        max_length=35, blank=True, help_text="Double Dependent Locality"
    )

    class Meta:
        abstract = False
        ordering = [
            "post_town",
        ]

    def __str__(self):
        return self.post_town

    @property
    def locality_set(self):
        # if self.locality: ## where is locality
        # loc_set = set((self.locality.filler1).split(' '))
        # loc_set.update(set((self.locality.filler2).split(' ')))
        loc_set = list((self.post_town).split(" "))
        loc_set.extend((self.dependent_locality).split(" "))
        loc_set.extend((self.double_dependent_locality).split(" "))
        return loc_set

    @property
    def locality_dict(self):
        locality_dict = {}
        locality_dict['_id'] = self._id
        locality_dict['locality_key'] = self.locality_key
        locality_dict['filler1'] = self.filler1
        locality_dict['filler2'] = self.filler2
        locality_dict['post_town'] = self.post_town
        locality_dict['dependent_locality'] = self.dependent_locality
        locality_dict['double_dependent_locality'] = self.double_dependent_locality

        return locality_dict

class Address(models.Model):

    outward_code = models.CharField(
        max_length=4, blank=True, help_text="Postcode: Outward Code"
    )
    inward_code = models.CharField(
        max_length=3, blank=True, help_text="Postcode: Inward Code"
    )

    locality = models.EmbeddedField(
        model_container=Locality,

    )

    objects = models.DjongoManager()

Used 'source=' attribute but it is still not flattened?