Как правильно удалять ребра с помощью orientdb OGM в django rest framework? - PullRequest
0 голосов
/ 09 июня 2019

Я не знаю, как создать метод для удаления ребер в django rest framework, используя orientdb OGM.

Я использую pyorient == 1.5.5 и версию OrientDB 3.0.18.

У меня есть два класса вершин: ousers, ocompany.Также у меня есть два отношения (ребра) Классы: ofriends, oworksat.Так, например:

Чтобы установить отношения друзей, мне нужны два клиента.И для того, чтобы завязать отношения, мне нужен один пользователь и одна компания.Каждое отношение имеет свой собственный идентификатор кластера.

Я знаю, что могу получить доступ к следующим функциям:

(Pdb) dir(graph)

['PROPERTY_TYPES', '_GROOVY_GET_DB', '_GROOVY_NULL_LISTENER', '_GROOVY_TRY',' класс ', ' delattr ', ' dict ', ' dir ', ' doc ',' eq ', ' format ', ' ge ', ' getattribute ', ' gt ',' hash ', ' init ', ' le ', ' lt ', ' module ',' ne ', ' new ', ' уменьшите ', ' redu_ex ', ' repr ',' setattr ', ' sizeof ', ' str ', ' subclasshook ', ' weakref ',«_last_cred», «_last_db», «_last_user», «пакет», «оба», «обаE», «build_mapping», «clear_registry», «клиент», «coerce_class_names», «coerce_class_names_to_quoted», «compute_all_properties», configute',' 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 ',' drop_all ',' drop_class ',' edge_from_record ','dge_from_records ',' element_from_link ',' element_from_record ',' elements_from_links ',' elements_from_records ',' export ',' get_edge ',' get_element ',' get_vertex ',' gremlin ',' 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:0 строка вершины пользователя, которая является частью отношений ofriends и oworskat, а также эта команда удаляет отношениябедро, где эта вершина включена.Очевидно, я не хочу удалять всю вершину, только конкретное ребро (не класс, а только строку отношения).

Мне было интересно, существует ли какая-нибудь команда, например delete_edge (),но dir (график) не говорит мне ничего связанного.

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 

1 Ответ

0 голосов
/ 16 июня 2019

Согласно документации 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 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 в качестве параметра (передавая идентификатор в методе DELETE в пользовательском интерфейсе swagger).

...