在 django rest 框架中使用 orientdb OGM 删除边缘的正确方法是什么?



我不知道如何使用orientdb OGM创建一个方法来删除django rest框架中的边缘。

我正在使用pyorient==1.5.5OrientDB 3.0.18版本。

我有两个顶点类:ousersocompany。我也有两个关系(边)类:ofriendsoworksat。所以例如:

要建立ofriends关系,我需要两个ousers。 而要建立oworksat关系,我需要一ouserocompany。 每个关系都有自己的群集 ID。

我知道我可以访问这些功能:

(Pdb) dir(graph)

['PROPERTY_TYPES', '_GROOVY_GET_DB', '_GROOVY_NULL_LISTENER', '_GROOVY_TRY', 'class', 'delattr', 'dict', 'dir', 'doc', 'eq', 'format', 'ge', 'getattribute', 'gt', 'hash', 'init', 'le', 'lt', 'module', 'ne', 'new', 'reduce', 'reduce_ex', 'repr', 'setattr', 'sizeof', 'str', 'subclasshook', 'weakref', '_last_cred', '_last_db', '_last_user', 'batch', 'both', 'bothE', 'build_mapping', 'clear_registry', 'client', 'coerce_class_names', 'coerce_class_names_to_quoted', 'compute_all_properties', 'config', 'create_all', "create_class", "create_edge", "create_edge_command", "create_function", "create_props_mapping", "create_vertex", "create_vertex_command", "delete_vertex", "delete_vertex_command", "下降", "drop_all", "drop_class", "edge_from_record", "edges_from_records", "element_from_link", "element_from_record", "elements_from_links", "elements_from_records", "出口", "get_edge", "get_element", "get_vertex", "小精灵",">guard_reserved_words">, 'inE', 'in_', 'include', 'init_broker_for_class', 'list_superclasses', 'ocompany', 'ofriends', 'open', 'ousers', 'out', 'outE', 'oworksat', 'populate

', 'property_from_schema', 'props_from_db', 'props_to_db', 'query', 'registry', 'save_element', 'scripts', 'server_version', 'strict', 'toposort_classes', 'valid_element_base', 'vertex_from_record', 'vertexes_from_records']如果我这样做:

graph.delete_vertex("#21:0")

它工作得很好,并删除了 #21:0ouser顶点行,这是ofriendsoworskat关系的一部分,因此,该命令也会删除包含该顶点的关系。显然,我不想删除整个顶点,只想删除特定的边(不是类,只是关系行)。

我想知道是否存在一些像 delete_edge() 这样的命令,但 dir(graph) 并没有告诉我任何相关内容。

settings.py

from pyorient.ogm import Graph, Config
from pyorient.serializations import OrientSerialization
from pyorient.ogm import declarative
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
config = RawConfigParser()
config.read(BASE_DIR + '/settings.ini')
ORIENTDB = {
'NAME': config.get('orientdbConf', 'DB_NAME'),
'USER': config.get('orientdbConf', 'DB_USER'),
'PASSWORD': config.get('orientdbConf', 'DB_PASS'),
'HOST': config.get('orientdbConf', 'DB_HOST'),
'PORT': config.get('orientdbConf', 'DB_PORT'),
}
Config.from_url('plocal://'+ORIENTDB['HOST']+':'+str(ORIENTDB['PORT'])+'/'+ORIENTDB['NAME']+'',''+ORIENTDB['USER']+'', ''+ORIENTDB['PASSWORD']+'',initial_drop=False,serialization_type=OrientSerialization.Binary)
graph = Graph(Config.from_url(''+ORIENTDB['HOST']+'/'+ORIENTDB['NAME']+'',''+ORIENTDB['USER']+'', ''+ORIENTDB['PASSWORD']+'',initial_drop=False))
Node = declarative.declarative_node()
Relationship = declarative.declarative_relationship()

models.py

from core.settings import Node,Relationship,graph
from pyorient.ogm.property import (String, Date, DateTime, Decimal, Double,
Integer, Boolean, EmbeddedMap, EmbeddedSet,Link, UUID)
class OUsers(Node):
element_plural = 'ousers'
postgresql_id=Integer(nullable=False,unique=True)
class OCompany(Node):
element_plural = 'ocompany'
postgresql_id=Integer(nullable=False,unique=True)
class OFriends(Relationship):
label = 'ofriends'
from_postgresql_ouser_id=Integer(nullable=False,unique=True)
to_postgresql_ouser_id=Integer(nullable=False,unique=True)
class OWorksAt(Relationship):
label = 'oworksat'
from_postgresql_ouser_id=Integer(nullable=False,unique=True)
to_postgresql_ocompany_id=Integer(nullable=False,unique=True)
graph.create_all(Node.registry)
graph.create_all(Relationship.registry)

serializers.py

from .models import (OUsers,OCompany,OFriends,OWorksAt)
from rest_framework import serializers
from django.contrib.auth import get_user_model
User = get_user_model()
class OFriendsSerializer(serializers.Serializer):
from_postgresql_ouser_id = serializers.IntegerField()
to_postgresql_ouser_id = serializers.IntegerField()
def create(self, data):
return OFriends.objects.create(**data)
def update(self, instance, data):
instance.from_postgresql_ouser_id = data.get("from_postgresql_ouser_id")
instance.to_postgresql_ouser_id = data.get("to_postgresql_ouser_id")
instance.save()
return instance
class OFriendsSerializer(serializers.Serializer):
from_postgresql_ouser_id = serializers.IntegerField()
to_postgresql_ouser_id = serializers.IntegerField()
def create(self, data):
return OFriends.objects.create(**data)
def update(self, instance, data):
instance.from_postgresql_ouser_id = data.get("from_postgresql_ouser_id")
instance.to_postgresql_ouser_id = data.get("to_postgresql_ouser_id")
instance.save()
return instance

api.py

class OFriendsViewSet(viewsets.ModelViewSet):
def destroy(self, request, *args, **kwargs):
queryset = graph.ofriends.query()
import pdb;pdb.set_trace()
# HERE should be the command 

根据 pyorient OGM 文档,该功能从未添加过。我已经在存储库中创建了一个问题。

所以目前,我使用 pyorient 客户端解决了我的问题,带有原始查询:

pyorient_client.py

from core.settings import ORIENTDB
import pyorient
def orientdbConnection():
"""Orientdb client connection"""
client = None
try:
client = pyorient.OrientDB(ORIENTDB['HOST'], int(ORIENTDB['PORT']))
session_id = client.connect( ORIENTDB['USER'], ORIENTDB['PASSWORD'] )
if client.db_exists( ORIENTDB['NAME'], pyorient.STORAGE_TYPE_MEMORY ):
client.db_open( ORIENTDB['NAME'], ORIENTDB['USER'], ORIENTDB['PASSWORD'])
except Exception as e:
print ("[ ERROR ] Fail orientdb connection. Error: " + str(e))
return client

在 api.py

from rest_framework import status
from rest_framework.response import Response
from core.pyorient_client import *
class OFriendsViewSet(viewsets.ModelViewSet):
def destroy(self, request, *args, **kwargs):
client = orientdbConnection()
client.command("delete edge ofriends where @rid = '" + kwargs['pk'] + "'")
return Response(status=status.HTTP_204_NO_CONTENT)

也许这对其他人有用。请注意,我收到 o'friends @rid 作为参数(通过在 swagger UI 中的 DELETE 方法中传递 id)。

自己构造命令的另一种方法是使用Graph.record_delete()并向其传递要删除的边缘的记录 ID。

下面的代码片段假定dbOrientDB的实例,并且rid保存要删除的链接的记录 ID:

cluster = rid[1:].split(':')[0]
record = rid[1:].split(':')[1]
db.record_delete(cluster, record)

作为侧边栏,我使用OrientDB的次数越多,我就越后悔选择数据库,因为缺乏对Python驱动程序的支持,该驱动程序在功能上不完整,现在也非常过时。

最新更新