Как создать экземпляры модели из html-формы и сохранить в AuraDb?
Большинство онлайн-учебников и видеороликов описывают, как создавать и сохранять экземпляры моделей в локальной базе данных с помощью Django. Я нашел эту статью на Medium https://medium.com/swlh/create-rest-api-with-django-and-neo4j-database-using-django-nemodel-1290da717df9, объясняющую, как загрузить модель в Neo4j. Я попытался запустить тот же проект, и вот что получилось, когда я перешел по адресу http://127.0.0.1:8000/person (см. снимок ниже).
Объект "Person" является структурированным узлом (StructuredNode), определенным следующим образом в models/person.py
:
from neomodel import StructuredNode, StringProperty, IntegerProperty,UniqueIdProperty, RelationshipTo
from myapi.models.city import City
class Person(StructuredNode):
uid = UniqueIdProperty()
name = StringProperty(unique_index=False)
age = IntegerProperty(index=True, default=0)
email = StringProperty(unique_index=True)
# Relations :
city = RelationshipTo(City, 'LIVES_IN')
friends = RelationshipTo('Person','FRIEND')
def __unicode__(self):
return self.uid
Я хочу получить данные от пользователя через форму и сохранить их как экземпляр объекта Person в моей AuraDB: person.save()
Поэтому в `views/forms.py' я создал форму следующего вида:
from django import forms
from splitjson.widgets import SplitJSONWidget
from myapi.models import Person
class testForm(forms.Form):
attrs = {'class': 'special', 'size': '40'}
data = forms.CharField(widget=SplitJSONWidget(attrs=attrs, debug=True))
class Meta:
model = Person
и я добавил его в качестве пути к urls.py
:
from django.urls import re_path as url
from myapi.views import *
from django.urls import path
urlpatterns = [
path('', home, name='home'),
path('home', home, name='home'),
path('sign-up', sign_up, name='sign_up'),
path('test-dict', test_dict, name='test_dict'),
path('person',personDetails),
path('getAllPersons',getAllPersons),
path('city',cityDetails),
path('getAllCities',getAllCities),
path('connectPaC',connectPaC),
path('connectPaP',connectPaP)
]
Путь с именем test-dict
ведет к этой функции, определенной в home.py
, которая пытается получить доступ к testForm
, созданному ранее.:
from django.template import RequestContext
from .forms import testForm
from django.template.loader import render_to_string
def test_dict(request):
json = {'name': 1,
'age': 4}
form = testForm(request.POST or None, initial={'data': json})
if form.is_valid():
# validate and save
pass
template = 'myapi/test_template.html'
#context = RequestContext(request, render_to_string(form))
return render(request, template, {'form': form})
И, наконец, вот как выглядит views/persons.py
:
from django.http import JsonResponse
from myapi.models import Person
from django.views.decorators.csrf import csrf_exempt
import json
from django.shortcuts import render, redirect
def getAllPersons(request):
if request.method == 'GET':
try:
persons = Person.nodes.all()
response = []
for person in persons :
obj = {
"uid": person.uid,
"name": person.name,
"age": person.age,
}
response.append(obj)
return JsonResponse(response, safe=False)
except:
response = {"error": "Error occurred"}
return JsonResponse(response, safe=False)
@csrf_exempt
def personDetails(request):
if request.method == 'GET':
# get one person by name
name = request.GET.get('name', ' ')
try:
person = Person.nodes.get(name=name)
response = {
"uid": person.uid,
"name": person.name,
"age": person.age,
}
return JsonResponse(response, safe=False)
except :
response = {"error":"Error occurred"}
return JsonResponse(response, safe=False)
#return render(response, 'myapi/test_template.html')
if request.method == 'POST':
# create one person
json_data = json.loads(request.body)
name = json_data['first_name']
email = str(json_data['email'])
try:
person = Person(name=name, email=email)
person.save()
response = {
"uid": person.uid,
}
return JsonResponse(response)
except :
response = {"error":"Error occurred"}
return JsonResponse(response, safe=False)
if request.method == 'PUT':
# update one person
json_data = json.loads(request.body)
name = json_data['name']
age = int(json_data['age'])
uid = json_data['uid']
try:
person = Person.nodes.get(uid=uid)
person.name = name
person.age = age
person.save()
response = {
"uid": person.uid,
"name": person.name,
"age": person.age,
}
return JsonResponse(response, safe=False)
except:
response = {"error":"Error occurred"}
return JsonResponse(response, safe=False)
if request.method == 'DELETE':
# delete one person
json_data = json.loads(request.body)
uid = json_data['uid']
try:
person = Person.nodes.get(uid=uid)
person.delete()
response = {"success": "Person deleted"}
return JsonResponse(response, safe=False)
except:
response = {"error":"Error occurred"}
return JsonResponse(response, safe=False)
Но это все еще не работает. Я хочу узнать, как можно создать экземпляр 'Person' на основе данных, полученных от пользователя через форму, и сохранить его в AuraDB (соединение с AuraDB, кстати, работает нормально). Я думаю, что это, конечно, возможно, но так как я совсем новичок, я могу реализовать это не совсем правильно.