Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JSONApi #11

Closed
GendoIkari opened this issue Mar 26, 2017 · 4 comments
Closed

JSONApi #11

GendoIkari opened this issue Mar 26, 2017 · 4 comments
Assignees

Comments

@GendoIkari
Copy link
Contributor

https://marshmallow-jsonapi.readthedocs.io/en/latest/

Gli Schema di marshmallow possono essere usati per creare json da servire al client che rispettino la JSONApi.

@dinghino
Copy link
Contributor

dinghino commented Apr 9, 2017

Stavo facendo prove per far entrare gli uuid degli Item nella relationship, invece dell'id che genera peewee e da quel che mi pare di aver capito non c"è modo di specificargli dove prendere il field id per il dump.
Se setto ad esempio la item_id come primary_key, durante il dump il field id viene None

class Item(BaseModel):
    item_id = UUIDField(unique=True, primary_key=True)
    # ...
{
    "relationships": {
        "items": {
            "data": [
                {
                    "id": null,
                    "type": "item"
                }
            ]
        }
    }
}

Nel tabella Item manca difatti il field id.

La soluzione che ho trovato è ridefinire il field id del modello

class Item(BaseModel):
    id = UUIDField(unique=True, primary_key=True, default=uuid4)

genera

{
    "relationships": {
        "items": {
            "data": [
                {
                    "id": "743146c4-e503-4f0c-b594-899bb5c33af0",
                    "type": "item"
                }
            ]
        }
    }
}

Questo ovviamente non corrisponde al field item_id che usiamo per riferirci all'item ovunque.

Tutto questo accade, mi pare di aver capito, perchè il dump accede all'oggetto di origine (il modello di PeeWee) e non a quello generato dal relativo schema (ItemSchema) quando genera i fields.Relationship

La soluzione più semplice sarebbe fare valutare #52 e reimplementare il field id per tutti i modelli direttamente da BaseModel.

@dinghino
Copy link
Contributor

ok, risolto il problema con id_field, anche se personalmente uniformerei comunque gli id (a voi la scelta, comunque).

Alcune domande, a questo punto:

  1. per i test faccio per ogni test case di ogni schema (Item, User, Order), o faccio casi generici?
  2. Con la pull request implemento anche tutte la funzionalità di jsonapi sugli endpoint (quindi rifattorizzo sua gli endpoint delle risorse ed i test), o lo facciamo in un secondo momento?
  3. Che relazioni vogliamo tra le varie classi?
    Io pensavo di strutturare le relazioni
  • Order
    • Item, include_data
    • User, solo relationship
  • Item nulla
  • User
    • Order, include_data

@dinghino
Copy link
Contributor

al momento la serializzazione in JSONApi viene così:

Item

Rappresenta semplicemente un oggetto Item.
Non sono sicuro del perchè i links vengono sia all'interno di data che come
key primaria. Penso sia come JSONApi si aspetta le risorse, comunque.

{
    "data": {
        "attributes": {
            "description": "Item 1 description.",
            "name": "Item 1",
            "price": 20.21
        },
        "id": "ab49055c-4f7c-4fb7-8945-7917255b83e7",
        "links": {
            "self": "/items/ab49055c-4f7c-4fb7-8945-7917255b83e7"
        },
        "type": "item"
    },
    "links": {
        "self": "/items/ab49055c-4f7c-4fb7-8945-7917255b83e7"
    }
}

User

La rappresentazione di un User con la relazione ai suoi Order associati.
In relationships è presente l'id e il type. Non sono sicuro si possa
associare, tramite Marshmallow, il link diretto alla risorsa - ad esempio /orders/12345/
direttamente nell'oggetto relationships, anche perchè da esempi sul sito di
jsonapi i relationship links puntano tutti a qualcosa come
/users/<user_id>/orders. Me la studio meglio, ma non so...

{
    "data": {
        "attributes": {
            "email": "[email protected]",
            "first_name": "John",
            "last_name": "Doe"
        },
        "id": "fe2b7fb2-6b9a-4023-afd0-4eaa2133917e",
        "links": {
            "self": "/users/fe2b7fb2-6b9a-4023-afd0-4eaa2133917e"
        },
        "relationships": {
            "orders": {
                "data": [
                    {
                        "id": "acc0145e-2edf-4eb1-a83c-2fb8092e8357",
                        "type": "order"
                    },
                    {
                        "id": "ef87ecf7-df15-49ca-8eb4-0b3c02dd45ee",
                        "type": "order"
                    }
                ]
            }
        },
        "type": "user"
    },
    "included": [
        {
            "attributes": {
                "date": "2017-04-10T19:15:11.053419+00:00",
                "delivery_address": "Via Rossi 12",
                "total_price": 110.72
            },
            "id": "acc0145e-2edf-4eb1-a83c-2fb8092e8357",
            "relationships": {
                "items": {
                    "data": [
                        {
                            "id": "9fe57785-0b6b-4017-a095-607b0ffaa39f",
                            "type": "item"
                        },
                        {
                            "id": "bb9b4de6-b545-4635-a030-d88c3c17fa72",
                            "type": "item"
                        }
                    ]
                },
                "user": {
                    "data": {
                        "id": "fe2b7fb2-6b9a-4023-afd0-4eaa2133917e",
                        "type": "user"
                    }
                }
            },
            "type": "order"
        },
        {
            "attributes": {
                "date": "2017-04-10T19:15:11.095406+00:00",
                "delivery_address": "Via Rossi 12",
                "total_price": 50.38
            },
            "id": "ef87ecf7-df15-49ca-8eb4-0b3c02dd45ee",
            "relationships": {
                "items": {
                    "data": [
                        {
                            "id": "bb9b4de6-b545-4635-a030-d88c3c17fa72",
                            "type": "item"
                        },
                        {
                            "id": "9fe57785-0b6b-4017-a095-607b0ffaa39f",
                            "type": "item"
                        }
                    ]
                },
                "user": {
                    "data": {
                        "id": "fe2b7fb2-6b9a-4023-afd0-4eaa2133917e",
                        "type": "user"
                    }
                }
            },
            "type": "order"
        }
    ],
    "links": {
        "self": "/users/fe2b7fb2-6b9a-4023-afd0-4eaa2133917e"
    }
}

Order

Order recupera i dati da serializzare dall'istanza Order passata alla funzione
e crea relazioni con l'User proprietario dell'ordine e con gli Item, contenuti
all'interno degli OrderItem relativi all'ordine (da Order.order_items),
che vengono serializzati non utilizzando ItemSchema ma, ovviamente, un
OrderItemSchema che però usa come id quello dell'Item e sempre per questo
genera i link alle risorse.

All'interno dello User incluso sono presenti pure le relationship per i suoi
ordini (id e type)

{
    "data": {
        "attributes": {
            "date": "2017-04-10T19:16:24.295220+00:00",
            "delivery_address": "Via Rossi 12",
            "total_price": 50.38
        },
        "id": "ec583a70-dd97-43f8-8c1b-68f52707c338",
        "relationships": {
            "items": {
                "data": [
                    {
                        "id": "f598f122-29bb-4fe3-a5fc-97113bf4c098",
                        "type": "item"
                    },
                    {
                        "id": "6620aafd-b411-45a0-b372-40743a0eb97b",
                        "type": "item"
                    }
                ]
            },
            "user": {
                "data": {
                    "id": "6ec131ba-c8c6-46c5-af26-0622a5e25192",
                    "type": "user"
                }
            }
        },
        "type": "order"
    },
    "included": [
        {
            "attributes": {
                "email": "[email protected]",
                "first_name": "John",
                "last_name": "Doe"
            },
            "id": "6ec131ba-c8c6-46c5-af26-0622a5e25192",
            "links": {
                "self": "/users/6ec131ba-c8c6-46c5-af26-0622a5e25192"
            },
            "relationships": {
                "orders": {
                    "data": [
                        {
                            "id": "7ccb5b11-ae5b-4391-a419-b33cc059d553",
                            "type": "order"
                        },
                        {
                            "id": "ec583a70-dd97-43f8-8c1b-68f52707c338",
                            "type": "order"
                        }
                    ]
                }
            },
            "type": "user"
        },
        {
            "attributes": {
                "description": "Item 2 awesome description.",
                "name": "Item 2",
                "price": 30.17,
                "quantity": 1,
                "subtotal": 30.17
            },
            "id": "f598f122-29bb-4fe3-a5fc-97113bf4c098",
            "links": {
                "self": "/items/f598f122-29bb-4fe3-a5fc-97113bf4c098"
            },
            "type": "order_item"
        },
        {
            "attributes": {
                "description": "Item 1 description.",
                "name": "Item 1",
                "price": 20.21,
                "quantity": 1,
                "subtotal": 20.21
            },
            "id": "6620aafd-b411-45a0-b372-40743a0eb97b",
            "links": {
                "self": "/items/6620aafd-b411-45a0-b372-40743a0eb97b"
            },
            "type": "order_item"
        }
    ]
}

@gvaldambrini
Copy link
Contributor

Chiudo, i followup task saranno aperti in altre pr

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants