Обратная связь Django/Tastypie не работает
Я пытаюсь сохранить и вставить данные в 2 связанные таблицы с помощью одного POST запроса, используя Tastypie.
Я отправляю вложенный JSON, который получает мой ресурс Restaurents. Этот ресурс затем вставит данные в Staff и создаст отношение OneToMany.
Ресурсы
class RestaurantResource(ModelResource):
staff = fields.ToManyField('api.resources.StaffResource', attribute='staff_set',
related_name='staff_fk', blank=True,
null=True, full=True)
class Meta:
authorization = Authorization()
queryset = Restaurant.objects.all()
resource_name = "staff"
allowed_methods = ['get', 'post', 'patch', 'put']
def full_hydrate(self, bundle, for_list=False):
initObj = Deserializers.buildResource(self, bundle, "initialisation")
# Fetches each field from nested JSON and puts it into python object, so I can assign them to bundle.obj
# Fields for Staff table
bundle.obj.Name = initObj.Name
bundle.obj.Gender = initObj.gender
# Fields for Restaurant table
bundle.obj.Postcode = initObj.postcode
bundle.obj.Capacity = initObj.capacity
return bundle
def obj_create(self, bundle, **kwargs):
set_info_obj = self.full_hydrate(bundle)
set_info_obj.obj.save()
# Here I'm expecting both tables to be populated with data. However, just Restaurant is populated.
return bundle
class StaffResource(ModelResource):
staff_fk = fields.ToOneField(RestaurantResource, 'staff_fk')
class Meta:
queryset = Staff.objects.all()
Модели
class Restaurant(models.Model):
RestaurantID = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
Postcode = models.CharField(max_length=200)
Capacity = models.CharField(max_length=200)
# objects = InheritanceManager()
class Staff(models.Model):
StaffID = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
Name = models.CharField(max_length=200)
Gender = models.CharField(max_length=200)
RestaurantID = models.ForeignKey(SetInfo, on_delete=models.SET_DEFAULT, default=1, related_name='staff_fk')
Я отправляю JSON с запросами и получаю ошибку:
simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
Вот мой код, который отправляется на сервер:
def sendToDB(jsonData):
import requests
url = "http://43.197.102.4:8100/api/v1/set_info/"
jsonData = {
"Restaurant": {
"Postcode": "AAABBBCCC",
"Capacity": 25.
}
"Staff": {
"Name": "Hans Zimmer",
"Gender": "Male"
}
}
print(json.dumps(jsonData, indent=4))
r = requests.post(url, json=json.dumps(jsonData))
r.json()
print(r)
# This is printing the JSON error
РЕДАКТИРОВАНИЕ:
Я могу сделать это:
def obj_create(self, bundle, **kwargs):
restaurant = Restaurant()
restaurant_created = restaurant.objects.create(bundle.obj.Postcode, bundle.obj.Capacity)
staff = Staff()
staff.objects.create(RestaurantID=restaurant_created.StaffID, bundle.obj.Name, bundle.obj.Gender)
return bundle
Но при этом игнорируется цикл гидратации/дегидратации TastyPie, так как он просто использует .create
от Django. Будет ли это хорошей практикой?