Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django Rest框架序列化程序中连接多个模型_Python_Django_Django Models_Django Rest Framework - Fatal编程技术网

Python 如何在Django Rest框架序列化程序中连接多个模型

Python 如何在Django Rest框架序列化程序中连接多个模型,python,django,django-models,django-rest-framework,Python,Django,Django Models,Django Rest Framework,在Django,我有以下模型 class Property(models.Model): address1 = models.CharField(max_length=512) address2 = models.CharField(max_length=128, blank=True, null=True) property_type = models.ForeignKey('PropertyType', models.DO_NOTHING, null=True, bl

在Django,我有以下模型

class Property(models.Model):
    address1 = models.CharField(max_length=512)
    address2 = models.CharField(max_length=128, blank=True, null=True)
    property_type = models.ForeignKey('PropertyType', models.DO_NOTHING, null=True, blank=True, default=None)
    geo_info = models.ForeignKey(GeoInfo, models.DO_NOTHING)
    
    class Meta:
        indexes = [
            models.Index(fields=['address1', ]),
        ]
        db_table = 'property'

class PropertyType(models.Model):
    name = models.CharField(max_length=128, blank=True, null=True)
    category = models.CharField(max_length=45, blank=True, null=True)
    color = models.CharField(max_length=45, blank=True, null=True)

    class Meta:
        db_table = 'property_type'
        indexes = [
            models.Index(fields=['name', ]),
        ]

class GeoInfo(models.Model):
    zipcode = models.CharField(max_length=25, blank=True, null=True)
    city = models.CharField(max_length=45, blank=True, null=True)
    state = models.CharField(max_length=45, blank=True, null=True)
    created_at = models.DateTimeField(auto_now_add=True, null=True)
    updated_at = models.DateTimeField(auto_now=True, null=True)

    class Meta:
        db_table = 'geo_info'
        indexes = [
            models.Index(fields=['zipcode', ]),
            models.Index(fields=['city', ]),
        ]
        
    def __str__(self):
        return '%s %s' % (self.zipcode, self.city)

我试图使用Django REST框架序列化属性模型,如下所示

class GeoSerializer(serializers.ModelSerializer):
    class Meta:
        model = GeoInfo
        fields = ['zipcode', 'city', 'state']


class PropertyTypeSerializer(serializers.ModelSerializer):
    class Meta:
        model = PropertyType

class PropertySerializer(serializers.ModelSerializer): 
    address_geo = GeoSerializer(many=False, read_only=True)
    prop_type = PropertyTypeSerializer(many=True, read_only=True)

    class Meta:
        model = Property
        fields = ['id', 'address1', 'address_geo', 'prop_type']

我对每个项目的预期结果如下

{
        "id": 1,
        "address1": "test address",
        "geo_info":{
           "zipcode":"12121",
           "city":"12121",
           "state":"12121",
           },
        "property_type": "unknown",
       
    }
目前,我只是得到了如下属性数据

{
        "id": 1,
        "address1": "test address"
}
那么您能帮我找出如何序列化这些模型吗?


另外,如果您能帮助我如何平展结果并尽可能避免嵌套节点,那将是非常好的

您的问题还不完全清楚。你要求不要筑巢。这可能对你有帮助-

class PropertySerializer(serializers.ModelSerializer):
    zipcode=serializers.SerializerMethodField()
    city=serializers.SerializerMethodField()
    state=serializers.SerializerMethodField()
    class Meta:
        model = Property
        fields = ('id','address1','zipcode','city','state','property_type')

    def get_zipcode(self,instance):
        return instance.geo_info.zipcode
    def get_city(self,instance):
        return instance.geo_info.city
    def get_state(self,instance):
        return instance.geo_info.state

请注意,序列化程序方法字段没有属于该字段的默认验证器。最好使用。