django-json-api / django-rest-framework-json-api

JSON:API support for Django REST framework
https://django-rest-framework-json-api.readthedocs.org/
BSD 2-Clause "Simplified" License
1.18k stars 294 forks source link

Allow meta attributes in relationship fields #406

Open svametcalf opened 6 years ago

svametcalf commented 6 years ago

I have a setup where we are using a ManyToMany field with a through model, similar to the situation described in this forum post from the json-api spec .

It seems like there are two ways of approaching this. One would be to use the meta key in the relationship, such as:

{
  "type": "objective",
  "id": "00559422-02E7-11DB-8468-BA18C3C820AE",
  "relationships": {
    "concepts": {
      "data": [
        { "type": "concept", "id": "02B7", "meta": { "emphasis": "primary" } },
        { "type": "concept", "id": "3AF6", "meta": { "emphasis": "secondary" } },
        { "type": "concept", "id": "CB23", "meta": { "emphasis": "tertiary" } }
      ]
    }
  }
}

Is this possible in using this library?

On the other hand, I could have the relationship point to the through model, which would be formatted as such:

{
  "type": "ObjectiveConceptLink", 
  "id": "....", 
  "attributes": {
     "emphasis": "primary", 
  }, 
  "relationships": {
     "concept": {
        "data": {
           "type": "concept", 
           "id": "...."
        }
     }, 
     "objective": {
        "data": {
           "type": "objective", 
           "id": "...."
        }
     }
  }
}

Right now in my app, the response does not respect the through key when using a ResourceRelatedField. The resulting response relationships key has a type of objective, as opposed to objective-concept-link.

Are either of these solutions possible with this library? If so, how?

sliverc commented 6 years ago

Currently meta is not supported with ResourceRelatedField but would be a good addition.

That your second approach is not working is most likely a bug. What you could do is to work around it to define a included_serializers with the objective relationship and define the correct resource_name.

Marking this issue as a bug, any investigation and PRs are most welcome.

ghost commented 10 months ago

Is Meta still not supported with ResourceRelatedField (as shown in the first example above)?

Even if it is not supported I figured it should be possible with a similar approach as used in https://github.com/django-json-api/django-rest-framework-json-api/discussions/1018.

Any suggestion what function to overwrite if I would like to add 1 meta field to a SerializerMethodResourceRelatedField (to data, not links)?

sliverc commented 10 months ago

No, this has not been implemented yet.

To implement it, I would suggest that a get_meta(rself, esource) returning a dict is added to ResourceRelatedField and then called at the appropriate spot in the renderer. A user can then create its own ResourceRelatedField with the desired meta fields.

Any PR is welcome.