Aldjemy запрос с ManyToManyField в модели django

Мне нужна помощь в решении следующей проблемы.

У меня есть следующая модель django, это простой пример с использованием ManyToManyField:

from django.db import models

# Create your models here.
class Publication(models.Model):
    title = models.CharField(max_length=30)

    class Meta:
        ordering = ['title']

    def __str__(self):
        return self.title

class Article(models.Model):
    headline = models.CharField(max_length=100)
    publications = models.ManyToManyField(Publication)

    class Meta:
        ordering = ['headline']

    def __str__(self):
        return self.headline

Тогда у меня есть следующий файл test.py.

Первый тест проходит нормально, но второй не работает:

from django.test import TestCase

# Create your tests here.
from magazine.models import Publication, Article

import sqlalchemy as sa
import sqlalchemy.orm as orm


class MagazineTestCase(TestCase):
    def setUp(self):
        p1 = Publication.objects.create(title='The Python Journal')
        p2 = Publication.objects.create(title='Science News')
        p3 = Publication.objects.create(title='Science Weekly')
        a1 = Article.objects.create(headline='Django lets you build web apps easily')
        a1.publications.add(p1)
        a2 = Article.objects.create(headline='NASA uses Python')
        a2.publications.add(p1,p2)

    def test_publications(self):
        article = Article.objects.get(headline='NASA uses Python')
        print(article)

def Session():
    from aldjemy.core import get_engine
    engine = get_engine()
    _Session = orm.sessionmaker(bind=engine)
    return _Session()

session = Session()

class AldjemyTestCase(TestCase):
    def setUp(self):
        p1 = Publication.objects.create(title='The Python Journal')
        p2 = Publication.objects.create(title='Science News')
        p3 = Publication.objects.create(title='Science Weekly')
        a1 = Article.objects.create(headline='Django lets you build web apps easily')
        a1.publications.add(p1)
        a2 = Article.objects.create(headline='NASA uses Python')
        a2.publications.add(p1,p2)

    def test_publications_with_aldjemy(self):
        article = Article.sa.query().join(Article.publications).all()
        print(article)

со следующей ошибкой:

root@d6fd57086074:/app/project# ./manage.py test magazine
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
NASA uses Python
.
======================================================================
ERROR: test_publications_with_aldjemy (magazine.tests.AldjemyTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/app/project/magazine/tests.py", line 43, in test_publications_with_aldjemy
    article = Article.sa.query().join(Article.publications).all()
  File "<string>", line 2, in join
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/sql/base.py", line 110, in _generative
    x = fn(self, *args, **kw)
  File "<string>", line 2, in join
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/orm/base.py", line 230, in generate
    fn(self, *args[1:], **kw)
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/orm/query.py", line 2409, in join
    joins_to_add = tuple(
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/orm/query.py", line 2411, in <genexpr>
    coercions.expect(
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/sql/coercions.py", line 212, in expect
    return impl._implicit_coercions(
  File "/usr/local/lib/python3.9/site-packages/sqlalchemy/sql/coercions.py", line 950, in _implicit_coercions
    elif legacy and resolved._is_select_statement:
AttributeError: 'NoneType' object has no attribute '_is_select_statement'

----------------------------------------------------------------------
Ran 2 tests in 0.066s

FAILED (errors=1)
Destroying test database for alias 'default'...

У меня есть некоторые проблемы с определением правильного утверждения для Article.sa.query().join(Article.publications).all(). Не могли бы вы мне помочь или подсказать?

Я только что понял, что нет необходимости использовать aldjemy, но я могу использовать Django ORM (https://docs.djangoproject.com/en/4.0/topics/db/queries/):

Этот код работает:

from django.test import TestCase

# Create your tests here.
from magazine.models import Publication, Article

class MagazineTestCase(TestCase):
    def setUp(self):
        p1 = Publication.objects.create(title='The Python Journal')
        p2 = Publication.objects.create(title='Science News')
        p3 = Publication.objects.create(title='Science Weekly')
        a1 = Article.objects.create(headline='Django lets you build web apps easily')
        a1.publications.add(p1)
        a2 = Article.objects.create(headline='NASA uses Python')
        a2.publications.add(p1,p2)

    def test_publications(self):
        article = Article.objects.get(headline='NASA uses Python')
        print(article)

class AldjemyTestCase(TestCase):
    def setUp(self):
        p1 = Publication.objects.create(title='The Python Journal')
        p2 = Publication.objects.create(title='Science News')
        p3 = Publication.objects.create(title='Science Weekly')
        a1 = Article.objects.create(headline='Django lets you build web apps easily')
        a1.publications.add(p1)
        a2 = Article.objects.create(headline='NASA uses Python')
        a2.publications.add(p1,p2)

    def test_articles(self):
        for a in Article.objects.all():
            print(a.headline)
Вернуться на верх