J'ai un modèle de page avec gfk. et p> i fait page.Object.get (pk = 1). content_object et je l'ai eu. p> aidez-moi s'il vous plaît à afficher un lien (ou une sortie à JSON) que l'objet ancré dans le repos. P> class PageResource(ModelResource):
content_object = fields.?????
class Meta:
queryset = Page.objects.all()
resource_name = 'page'
7 Réponses :
Il n'y a actuellement aucun moyen facile d'utiliser des relations génériques dans la saveur de Tastypie. Il y a eu des patchs soumis à TASTYPIE GITUB mais ceux-ci n'ont pas été fusionnés de cette écriture .
Le moyen le plus simple de le faire, définissez une ressource de contenu de contenu et utilisez cela pour les ressources ayant une relation générique. Quelque chose le long des lignes de: p> espère que cela aide cela aide. P> p>
J'essaie de mettre en œuvre cela maintenant. Pourriez-vous s'il vous plaît fournir un peu plus de contexte pour m'aider à comprendre. J'ai un additif, qui a une relation générique avec des attributs. Je voudrais obtenir tous les attributs d'un additif donné. Dans votre exemple, qu'est-ce que "myresources", contributions / contenttype "," modèle "se réfère. Merci.
Juste une note pour quelque chose qui vous dérangeait sur la mise en œuvre de cette option: Si vous utilisez des relations génériques inverse, vous ne pouvez pas oublier d'utiliser des champs.Tomanfield sur le modèle qui accède à la ressource générique.
La chose "myResources" est l'application qui contient le contenttyperesource. Si c'est dans la même application que vos autres ressources, vous n'avez pas besoin de le qualifier. Supprimé dans le code ci-dessous.
Le "contrib / contenttype" est le nom de la ressource. Définir votre propre nom est facultatif. TASTYPIE en créera un pour vous si vous ne le spécifiez pas. Je l'ai supprimé dans le code de mise à jour ci-dessous. P>
Les champs Je pense que la réponse d'origine avait ses noms de champs. Vous essayez de créer une nouvelle ressource pour content_type et accrochez-la jusqu'à la clé étrangère content_type de votre modèle. Le code ci-dessus trie cela. P> Vous devez également enregistrer contenttyperesource dans vos URLs.py comme vous avez avec toutes vos autres ressources: P> = ["Modèle"] code> limite les champs accessibles du modèle que cette ressource représente. Si vous regardez la définition du modèle de contenuType dans le code Django, vous verrez qu'il a un champ appelé «modèle». P>
from myapp.api import ContentTypeResource
v1_api = Api(api_name='v1')
v1_api.register(ContentTypeResource())
Cela vous donne le champ content_Object comme objet imbriqué. C'est simple, cela fonctionne, et c'est (malheureusement) aussi efficace que la technologie permettra.
Nous avons réussi à obtenir l'URI de l'objet de contenu, s'il avait une modélisation correspondante:
class ContentTypeResource(ModelResource): class Meta: queryset = ContentType.objects.all() resource_name = 'content_type' allowed_methods = ['get',] class PageObjectResource(ModelResource): content_object_uri = fields.CharField() content_type = fields.ToOneField( ContentTypeResource, attribute = 'content_type', full=True) class Meta: queryset = models.PageObject.objects.all() resource_name = 'page_object' allowed_methods = ['get',] def dehydrate_content_object_uri(self, bundle): for resource in api._registry.values(): if resource._meta.object_class == bundle.obj.content_object.__class__: return resource.get_resource_uri(bundle.obj.content_object) return ''
Nous avons craqué le code!
"page_objects": [ { "content_object": { "id": "186", "look_stills": [ { "_image": "/static/media/uploads/looks/DSC_0903_PR_MEDIUM_QUALITY_RGB_FA.jpg", "aspect": "front", "id": "186", "look_still_icons": [ { "colour_code": "58", "enabled": true, "id": "186", "in_stock_only": true, "look_product": { "colour_code": "58", "enabled": true, "id": "186", "resource_uri": "/api/look_product/186/", "style_code": "420215" }, "resource_uri": "/api/look_still_icon/186/", "x_coord": 76, "y_coord": 5 } ], "ordering": 1, "resource_uri": "/api/look_still/186/" } ], "resource_uri": "/api/look_still_set/186/", "slug": "" }, "content_type": { "app_label": "looks_beta", "id": "97", "model": "lookstillset", "name": "look still set", "resource_uri": "/api/content_type/97/" }, "id": "2", "object_id": 186, "resource_uri": "/api/page_object/2/" } ], "page_order": 3, "page_template": "look_still", "resource_uri": "/api/page/2/", "slug": "", "spread_number": 2, "title": "" },
On dirait que cela a été officiellement ajouté à la tastypie il y a un mois, consultez l'exemple ici. P>
https://github.com/Toastdriven/django- TASTYPIE / BLOB / MASTER / DOCS / CONTENT_TYPES.RST P>
Mais cela a besoin de savoir quels modèles vous dirigez votre relation. Quel type de défaite le but d'avoir un génériqueForignkey en premier lieu.
Ils ont en réalité ajouté un soutien à cela comme le suggéré Mario. Comme il a fallu pour toujours pour comprendre, je pensais que cela pourrait aider certaines personnes à sortir. Voici un exemple utilisant les modèles de commentaire intégrés de Django où je reçois une relation inverse sur les commentaires de l'objet commenté:
Ajoutez ceci au modèle que les commentaires sont attachés à: p>
class UserResource(ModelResource): what ever you need here.... class CmntedObjectResource(ModelResource): comments = fields.ToManyField('path.to.api.CmntedObjectResource', 'comments', full=True, null=True) class Meta: queryset = CmntedObject.objects.all() resource_name = 'cmntedobject' allowed_methods = ['get', 'post', 'delete'] authorization = DjangoAuthorization() class CommentResource(ModelResource): user = fields.ToOneField('path.to.api.UserResource', 'user', full=True) content_type_id = fields.CharField(attribute = 'content_type_id') site_id = fields.CharField(attribute = 'site_id') content_object = GenericForeignKeyField({ CmntedObject: CmntedObjectResource, #shown above OtherCmntedObject: OtherCmntedObjectResource, #optional }, 'content_object', null=True) class Meta: queryset = Comment.objects.all() resource_name = 'cmnt' allowed_methods = ['get', 'post', 'delete'] authorization = DjangoAuthorization() def obj_create(self, bundle, **kwargs): #here we get the current authenticated user as the comment user. bundle = super(CmntResource, self).obj_create(bundle, user=bundle.request.user) return bundle
Avez-vous déjà eu cela fonctionnant sans appliquer les patchs à la saveur?