Tortoise ORM „ReverseRelation ist bereits spezialisiert“Python

Python-Programme
Anonymous
 Tortoise ORM „ReverseRelation ist bereits spezialisiert“

Post by Anonymous »

Der folgende Code enthält zwei 1:n-Beispiele in Tortoise ORM und funktioniert wie erwartet. Sie sind fast gleich, aber im zweiten Beispiel beschwert sich Pylance mit der seltsamen Fehlermeldung „ReverseRelation ist bereits spezialisiert“.

Code: Select all

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())

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post