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)