ImportError: cannot import name 'djongo_access_url' from 'djongo'

Я получаю следующую ошибку при использовании Djongo с Mongodb на сервере django:

My users/views.py:

from django.shortcuts import render
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt

import json

from helpers.view_functions import parse_request_body
from .models import UserProfile

from djongo import transaction


@csrf_exempt
def get_user_profile(request, user_id):
    # pass
    if request.method == 'GET':
        with transaction.atomic():
            profile, created = UserProfile.objects.get_or_create(user_id=user_id)
        if created:
            profile.user_id = user_id
            profile.searches = [
                {'search_term': 'hd'},
                {'search_term': 'wba'},
            ]
            profile.display_settings = [
                {'setting_name': 'showYieldChange', 'visible': True},
                {'setting_name': 'showAllDividends', 'visible': True},
            ]
            profile.save()
            print("user saved in db")
        user = UserProfile.objects.get(user_id=user_id)


        data = {
            'user_id': user.user_id,
            'searches': user.searches,
            'display_settings': user.display_settings
        }
        json_data = json.dumps(data)
        return HttpResponse({json_data}, content_type='application/json')

    if request.method == 'POST':
        body = parse_request_body(request)
        searches = body['searches']
        searches_objects = [{'search_term': x} for x in searches]
        print("New searches for user {user_id}".format(user_id=user_id))
        print(searches_objects)
        user = UserProfile.objects.get(user_id=user_id)
        user.searches = searches_objects
        user.display_settings = body['display_settings']
        user.save()
        return HttpResponse("it worked")

users/urls.py:

from django.urls import path

from . import views

app_name = 'dividends'
urlpatterns = [
    path('<str:user_id>', views.get_user_profile, name='get_user_profile'),
]

requirements.txt:

bs4
django==3.1.12
django-cors-headers
djongo
gunicorn
html5lib
pymongo==3.12.3
python-decouple
yfinance
<
from djongo import models


class RecentSearch(models.Model):
    search_term = models.CharField(max_length=100)

    class Meta:
        abstract = True


class DisplaySetting(models.Model):
    setting_name = models.CharField(max_length=150)
    visible = models.BooleanField()

    class Meta:
        abstract = True


class UserProfile(models.Model):
    user_id = models.CharField(max_length=255, unique=True)
    searches = models.ArrayField(model_container=RecentSearch, null=True)
    display_settings = models.ArrayField(model_container=DisplaySetting, null=True)

    objects = models.DjongoManager()
users/models.py:

в ipython:

IPython 8.4.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import djongo

In [2]: from djongo import transaction
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
Input In [2], in <cell line: 1>()
----> 1 from djongo import transaction

File ~/.local/lib/python3.10/site-packages/djongo/transaction.py:2, in <module>
      1 from djongo.exceptions import NotSupportedError
----> 2 from djongo import djongo_access_url
      4 print(f'This version of djongo does not support transactions. Visit {djongo_access_url}')
      5 raise NotSupportedError('transactions')

ImportError: cannot import name 'djongo_access_url' from 'djongo' (/home/cchilders/.local/lib/python3.10/site-packages/djongo/__init__.py)

In [3]: 

правильное использование get_or_create и сохранение новых данных только если created=True решает проблему дублирования моделей, когда должна быть только одна уникальная

@csrf_exempt
def get_user_profile(request, user_id):
    pass
    if request.method == 'GET':
        # with transaction.atomic():
        profile, created = UserProfile.objects.get_or_create(user_id=user_id)
        if created:
            profile.user_id = user_id
            profile.searches = [
                {'search_term': 'hd'},
                {'search_term': 'wba'},
            ]
            profile.display_settings = [
                {'setting_name': 'showYieldChange', 'visible': True},
                {'setting_name': 'showAllDividends', 'visible': True},
            ]
            profile.save()
            print("user saved in db")
        # user = UserProfile.objects.get(user_id=user_id)

    
        data = {
            'user_id': profile.user_id,
            'searches': profile.searches,
            'display_settings': profile.display_settings
        }
        json_data = json.dumps(data)
        return HttpResponse({json_data}, content_type='application/json')

вы должны установить уникальный атрибут, такой как user_id или биржевой тикер на unique=True

@csrf_exempt
def get_user_profile(request, user_id):
    pass
    if request.method == 'GET':
        # with transaction.atomic():
        profile, created = UserProfile.objects.get_or_create(user_id=user_id)
        if created:
            profile.user_id = user_id
            profile.searches = [
                {'search_term': 'hd'},
                {'search_term': 'wba'},
            ]
            profile.display_settings = [
                {'setting_name': 'showYieldChange', 'visible': True},
                {'setting_name': 'showAllDividends', 'visible': True},
            ]
            profile.save()
            print("user saved in db")
        # user = UserProfile.objects.get(user_id=user_id)

    
        data = {
            'user_id': profile.user_id,
            'searches': profile.searches,
            'display_settings': profile.display_settings
        }
        json_data = json.dumps(data)
        return HttpResponse({json_data}, content_type='application/json')

модели

class UserProfile(models.Model):
    user_id = models.CharField(max_length=255, unique=True)
    searches = models.ArrayField(model_container=RecentSearch, null=True)
    display_settings = models.ArrayField(model_container=DisplaySetting, null=True)

    objects = models.DjongoManager()
Вернуться на верх