我正在使用Django休息框架,我正在使用api进行一个ember项目。
我正在使用可浏览的api界面,我可以使用HTML表单创建和更新,但是当我尝试使用原始JSON执行相同操作时,我收到此错误:
"propiedad": [
"This field may not be null."
]
我一直在测试几种配置,我在互联网上阅读了文档和几个问题,但我不知道我做错了什么。
这些是我的模特:
class Propiedad(models.Model): # Datos
user = models.ForeignKey(User,verbose_name='Usuario')
titulo = models.CharField('Título', max_length=100)
tipo_propiedad = models.ForeignKey('tipos.Tipo_propiedad', verbose_name='Tipo de propiedad')
tipo_operacion = models.ForeignKey('tipos.Tipo_operacion',verbose_name='Tipo de operación')
descripcion = models.TextField('Descripción',blank=True, null=True)
vistas = models.IntegerField('Vistas', blank=True, null=True)
likes = models.IntegerField('Me gusta', blank=True, null=True)
precio = models.IntegerField('Precio')
moneda = models.CharField('Moneda', max_length=4,choices=MONEDA, default=MONEDA[0][0])
tipo_cobro = models.ForeignKey('tipos.Tipo_cobro',verbose_name='Tipo de cobro', blank=True, null=True)
expiracion = models.DateTimeField('Fecha de expiración', blank=True, null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
verbose_name = 'Propiedad'
verbose_name_plural = 'Propiedades'
def __unicode__(self):
return self.titulo
class Datos_generales(models.Model):
propiedad = models.OneToOneField('propiedades.Propiedad',verbose_name='Propiedad',blank=True,null=True)
fraccionamiento = models.BooleanField('Fraccionamiento', default=False, blank=True)
calle = models.CharField('Calle', max_length=100)
colonia = models.CharField('Colonia', max_length=100)
numero_exterior = models.CharField('Número exterior', max_length=10, blank=True, null=True)
numero_interior = models.CharField('Número interior', max_length=10, blank=True, null=True)
codigo_postal = models.CharField('Código postal', max_length=10, blank=True, null=True)
edad = models.CharField('Edad del inmueble', max_length=20, blank=True, null=True)
estado_conservacion = models.CharField('Estado de conservación', max_length=20, choices=ESTADO_CONSERVACION,blank=True, null=True)
cuartos = models.IntegerField('Núm. Cuartos', blank=True, null=True)
banios = models.IntegerField('Núm. Baños', blank=True, null=True)
medios_banios = models.IntegerField('Núm. Medios baños', blank=True, null=True)
estacionamientos = models.IntegerField('Estacionamientos', blank=True, null=True)
ubicacion = GeopositionField()
class Meta:
verbose_name = 'Datos generales'
verbose_name_plural = 'Datos generales'
def __unicode__(self):
return 'Datos generales'
class Caracteristicas(models.Model): # Características generales
propiedad = models.OneToOneField('propiedades.Propiedad',verbose_name='Propiedad',blank=True,null=True)
vestidor = models.BooleanField('Vestidor', default=False, blank=True)
azotea = models.BooleanField('Azotea', default=False, blank=True)
jardin = models.BooleanField('Jardín', default=False, blank=True)
cocina_integral = models.BooleanField('Cocina integral', default=False, blank=True)
comedor = models.BooleanField('Comedor', default=False, blank=True)
sala = models.BooleanField('Sala', default=False, blank=True)
cuartos_servicio = models.BooleanField('Cuartos de servicio', default=False, blank=True)
cuarto_lavado = models.BooleanField('Cuarto de lavado', default=False, blank=True)
niveles_construidos = models.IntegerField('Niveles construidos', blank=True, null=True)
mascotas = models.BooleanField('Mascotas', default=False, blank=True)
acceso_discapacitados = models.BooleanField('Acceso discapacitados', default=False, blank=True)
amueblado = models.CharField('Amueblado', max_length=30, choices=AMUEBLADO, default=AMUEBLADO[0][0], blank=True, null=True)
tipo_terreno = models.CharField('Tipo de terreno', max_length=20, choices=TIPO_TERRENO, blank=True, null=True)
escuelas_cercanas = models.BooleanField('Escuelas cercanas', default=False, blank=True)
cc_cercanos = models.BooleanField('Centros Comerciales Cercanos', default=False, blank=True)
class Meta:
verbose_name = 'Caracteristicas'
verbose_name_plural = 'Caracteristicas'
def __unicode__(self):
return 'Caracteristicas'
class Amenidades(models.Model): # Amenidades
propiedad = models.OneToOneField('propiedades.Propiedad',verbose_name='Propiedad',blank=True,null=True)
desayunador = models.BooleanField('Desayunador', default=False, blank=True)
sala_tv = models.BooleanField('Sala de TV', default=False, blank=True)
terraza = models.BooleanField('Terraza', default=False, blank=True)
alberca = models.BooleanField('Alberca', default=False, blank=True)
jacuzzi = models.BooleanField('Jacuzzi', default=False, blank=True)
salon_juegos = models.BooleanField('Salón de juegos', default=False, blank=True)
salon_fiestas = models.BooleanField('Salón de fiestas', default=False, blank=True)
estudio = models.BooleanField('Estudio', default=False, blank=True)
bodegas = models.IntegerField('Bodega(s)', default=0, blank=True, null=True)
vista_panoramica = models.BooleanField('Vista panorámica', default=False, blank=True)
class Meta:
verbose_name = 'Amenidades'
verbose_name_plural = 'Amenidades'
def __unicode__(self):
return 'Amenidades'
class Servicios(models.Model): # Servicios
propiedad = models.OneToOneField('propiedades.Propiedad',verbose_name='Propiedad',blank=True,null=True)
cisterna = models.BooleanField('Cisterna', default=False, blank=True)
aire_acondicionado = models.IntegerField('Aire acondicionado', default=0, blank=True, null=True)
alarma = models.BooleanField('Alarma', default=False, blank=True)
gimnasio = models.BooleanField('Gimnasio', default=False, blank=True)
asador = models.BooleanField('Asador/Parrila', default=False, blank=True)
calefaccion = models.BooleanField('Calefacción', default=False, blank=True)
seguridad_privada = models.BooleanField('Seguridad privada', default=False, blank=True)
servicios_basicos = models.BooleanField('Servicios básicos (agua/luz)', default=False, blank=True)
gas = models.BooleanField('Gas', default=False, blank=True)
linea_telefonica = models.BooleanField('Línea telefónica', default=False, blank=True)
internet = models.BooleanField('Internet', default=False, blank=True)
class Meta:
verbose_name = 'Servicios'
verbose_name_plural = 'Servicios'
def __unicode__(self):
return 'Servicios'
我的serializers.py文件:
class Datos_generalesSerializer(serializers.ModelSerializer):
class Meta:
model = Datos_generales
fields = (
"id",
"fraccionamiento",
"calle",
"colonia",
"numero_exterior",
"numero_interior",
"codigo_postal",
"edad",
"estado_conservacion",
"cuartos",
"banios",
"medios_banios",
"estacionamientos",
"ubicacion",
)
class CaracteristicasSerializer(serializers.ModelSerializer):
class Meta:
model = Caracteristicas
fields = (
"id",
"vestidor",
"azotea",
"jardin",
"cocina_integral",
"comedor",
"sala",
"cuartos_servicio",
"cuarto_lavado",
"niveles_construidos",
"mascotas",
"acceso_discapacitados",
"amueblado",
"tipo_terreno",
"escuelas_cercanas",
"cc_cercanos",
)
我的views.py文件
class PropiedadViewSet(viewsets.ModelViewSet):
serializer_class = PropiedadSerializer
queryset = Propiedad.objects.all()
def perform_create(self, serializer):
serializer.save(user=self.request.user)
提前致谢。
更新
我发送的用于创建新对象的JSON代码,更新是相同的代码,但顶部有“id”键(显然:P):
{
"user": 1,
"titulo": "Praesent egestas neque",
"tipo_propiedad": 1,
"tipo_operacion": 1,
"datos_generales": {
"id": 1,
"fraccionamiento": true,
"calle": "Praesent blandit laoreet",
"colonia": "Pellentesque habitant morbi tristique",
"numero_exterior": "1234",
"numero_interior": "",
"codigo_postal": "12345",
"edad": "10",
"estado_conservacion": "excelente",
"cuartos": 3,
"banios": 2,
"medios_banios": 1,
"estacionamientos": 2,
"ubicacion": "23.241346102386135,-101.953125"
},
"caracteristicas": {
"id": 1,
"vestidor": true,
"azotea": true,
"jardin": true,
"cocina_integral": true,
"comedor": true,
"sala": true,
"cuartos_servicio": true,
"cuarto_lavado": true,
"niveles_construidos": 2,
"mascotas": true,
"acceso_discapacitados": true,
"amueblado": "si",
"tipo_terreno": "ascendente",
"escuelas_cercanas": true,
"cc_cercanos": true
},
"amenidades": {
"desayunador": true,
"sala_tv": true,
"terraza": true,
"alberca": true,
"jacuzzi": false,
"salon_juegos": false,
"salon_fiestas": false,
"estudio": false,
"bodegas": 0,
"vista_panoramica": true
},
"servicios": {
"id": 1,
"cisterna": true,
"aire_acondicionado": 0,
"alarma": false,
"gimnasio": true,
"asador": false,
"calefaccion": true,
"seguridad_privada": false,
"servicios_basicos": false,
"gas": false,
"linea_telefonica": false,
"internet": false
},
"descripcion": "Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In ac dui quis mi consectetuer lacinia. Ut non enim eleifend felis pretium feugiat. Praesent blandit laoreet nibh. Phasellus ullamcorper ipsum rutrum nunc.\r\n\r\nFusce fermentum. Phasellus volutpat, metus eget egestas mollis, lacus lacus blandit dui, id egestas quam mauris ut lacus. Nam eget dui. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo.",
"precio": 3500,
"moneda": "usd",
"expiracion": null,
"vistas": 0,
"likes": 0
}
更新2:
经过大量测试后,我发现真正的问题是“ember-django-adapter”软件包。