Tortoise ORM «ReverseRelation уже специализирован» (с решением)Python

Программы на Python
Ответить
Anonymous
 Tortoise ORM «ReverseRelation уже специализирован» (с решением)

Сообщение Anonymous »

Это напоминание мне самому и может быть полезно другим. Приведенный ниже код содержит два примера 1:n в Tortoise ORM и работает должным образом. Они почти равны, но во втором примере pylance выдает странное сообщение об ошибке «ReverseRelation уже специализирован».
'''
from tortoise import Tortoise, fields, run_async
from tortoise.models import Model

class Experiment(Model):
id = fields.IntField(autoincrement=True, primary_key=True)
experiment = fields.CharField(max_length=20)
estimates = fields.ReverseRelation["Estimate"]

def __str__(self) -> str:
return self.experiment

class Estimate(Model):
id = fields.IntField(autoincrement=True, primary_key=True)
estimate = fields.FloatField()
experiment: fields.ForeignKeyRelation[Experiment] = fields.ForeignKeyField(
"models.Experiment",
related_name="estimates",
)

def __str__(self) -> str:
return f"{self.estimate}"

# region ---------- Working Models for Reverse Relation Testing ----------
class Tournament(Model):
id = fields.IntField(primary_key=True)
name = fields.TextField()
events: fields.ReverseRelation["Event"]

def __str__(self):
return self.name

class Event(Model):
id = fields.IntField(primary_key=True)
name = fields.TextField()
tournament: fields.ForeignKeyRelation[Tournament] = fields.ForeignKeyField(
"models.Tournament", related_name="events"
)

def __str__(self):
return self.name

# endregion ---------- Working Models for Reverse Relation Testing ----------

async def run():
await Tortoise.init(db_url="sqlite://:memory:", modules={"models": ["__main__"]})
await Tortoise.generate_schemas()

tournament = await Tournament.create(name="tournament")
await Event.create(name="First", tournament=tournament)
await Event.create(name="Second", tournament=tournament)
tournament = await Tournament.first().prefetch_related("events")
assert tournament is not None
assert tournament.events[0].name == "First"

experiment = await Experiment.create(experiment="Test Experiment")
await Estimate.create(experiment=experiment, estimate=9.5)

experiment = await Experiment.first().prefetch_related("estimates")
assert experiment is not None
# The line below does not throw, but gives error "ReverseRelation is already specialized"
assert experiment.estimates[0].estimate == 9.5

if __name__ == "__main__":
run_async(run())

'''


Подробнее здесь: https://stackoverflow.com/questions/798 ... h-solution
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»