django-rest-framework-json-api icon indicating copy to clipboard operation
django-rest-framework-json-api copied to clipboard

Allow meta attributes in relationship fields

Open svametcalf opened this issue 7 years ago • 3 comments

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?

svametcalf avatar Jan 31 '18 21:01 svametcalf

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.

sliverc avatar Jun 12 '18 06:06 sliverc

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

YetAnotherWebDeveloper avatar Oct 28 '23 14:10 YetAnotherWebDeveloper

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.

sliverc avatar Oct 30 '23 08:10 sliverc