Fix circular reference recursion in JSON serialization
Dataclass models have parent back-references (TrackLayout→Circuit→ Locality→Country) causing infinite recursion in dataclasses.asdict(). Add to_dict() methods that exclude parent refs, use them in API endpoints.
This commit is contained in:
@@ -19,6 +19,14 @@ class Circuit:
|
||||
locality: 'Locality'
|
||||
layouts: dict[str, TrackLayout]
|
||||
|
||||
def to_dict(self) -> dict:
|
||||
return {
|
||||
"slug": self.slug,
|
||||
"name": self.name,
|
||||
"urls": {"wikipedia": self.urls.wikipedia, "fandom": self.urls.fandom},
|
||||
"layouts": {k: v.to_dict() for k, v in self.layouts.items()},
|
||||
}
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, locality: 'Locality', slug: str, data: dict) -> 'Circuit':
|
||||
circuit = cls(
|
||||
|
||||
@@ -7,6 +7,13 @@ class Country:
|
||||
name: str
|
||||
localities: dict[str, Locality]
|
||||
|
||||
def to_dict(self) -> dict:
|
||||
return {
|
||||
"slug": self.slug,
|
||||
"name": self.name,
|
||||
"localities": {k: v.to_dict() for k, v in self.localities.items()},
|
||||
}
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, slug: str, data: dict):
|
||||
country = cls(
|
||||
|
||||
@@ -12,6 +12,13 @@ class Locality:
|
||||
country: 'Country'
|
||||
circuits: dict[str, Circuit]
|
||||
|
||||
def to_dict(self) -> dict:
|
||||
return {
|
||||
"slug": self.slug,
|
||||
"name": self.name,
|
||||
"circuits": {k: v.to_dict() for k, v in self.circuits.items()},
|
||||
}
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, country: 'Country', slug: str, data: dict):
|
||||
locality = cls(
|
||||
|
||||
@@ -27,6 +27,13 @@ class TrackLayout:
|
||||
circuit=circuit
|
||||
)
|
||||
|
||||
def to_dict(self) -> dict:
|
||||
return {
|
||||
"slug": self.slug,
|
||||
"description": self.description,
|
||||
"imageUrl": self.imageUrl,
|
||||
}
|
||||
|
||||
@property
|
||||
def coordinates(self) -> list[tuple[float, float]]:
|
||||
return self._geo_data.features[0].geometry.coordinates
|
||||
|
||||
Reference in New Issue
Block a user