mirror of
				https://github.com/graphql-python/graphene-django.git
				synced 2025-11-01 00:17:38 +03:00 
			
		
		
		
	Merge pull request #43 from chriscauley/cookbook
fixes #8, base import of field no longer works for query property. Us…
This commit is contained in:
		
						commit
						423d7abdf6
					
				|  | @ -2,5 +2,9 @@ from django.contrib import admin | ||||||
| 
 | 
 | ||||||
| from cookbook.ingredients.models import Category, Ingredient | from cookbook.ingredients.models import Category, Ingredient | ||||||
| 
 | 
 | ||||||
| admin.site.register(Ingredient) | @admin.register(Ingredient) | ||||||
|  | class IngredientAdmin(admin.ModelAdmin): | ||||||
|  |   list_display = ("id","name","category") | ||||||
|  |   list_editable = ("name","category") | ||||||
|  |    | ||||||
| admin.site.register(Category) | admin.site.register(Category) | ||||||
|  |  | ||||||
|  | @ -0,0 +1,20 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | # Generated by Django 1.9 on 2016-11-04 00:50 | ||||||
|  | from __future__ import unicode_literals | ||||||
|  | 
 | ||||||
|  | from django.db import migrations, models | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Migration(migrations.Migration): | ||||||
|  | 
 | ||||||
|  |     dependencies = [ | ||||||
|  |         ('ingredients', '0001_initial'), | ||||||
|  |     ] | ||||||
|  | 
 | ||||||
|  |     operations = [ | ||||||
|  |         migrations.AlterField( | ||||||
|  |             model_name='ingredient', | ||||||
|  |             name='notes', | ||||||
|  |             field=models.TextField(blank=True, null=True), | ||||||
|  |         ), | ||||||
|  |     ] | ||||||
|  | @ -10,7 +10,7 @@ class Category(models.Model): | ||||||
| 
 | 
 | ||||||
| class Ingredient(models.Model): | class Ingredient(models.Model): | ||||||
|     name = models.CharField(max_length=100) |     name = models.CharField(max_length=100) | ||||||
|     notes = models.TextField() |     notes = models.TextField(null=True,blank=True) | ||||||
|     category = models.ForeignKey(Category, related_name='ingredients') |     category = models.ForeignKey(Category, related_name='ingredients') | ||||||
| 
 | 
 | ||||||
|     def __str__(self): |     def __str__(self): | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| from cookbook.ingredients.models import Category, Ingredient | from cookbook.ingredients.models import Category, Ingredient | ||||||
| from graphene import AbstractType, Field, Node | from graphene import AbstractType, Node | ||||||
| from graphene_django.filter import DjangoFilterConnectionField | from graphene_django.filter import DjangoFilterConnectionField | ||||||
| from graphene_django.types import DjangoObjectType | from graphene_django.types import DjangoObjectType | ||||||
| 
 | 
 | ||||||
|  | @ -31,8 +31,8 @@ class IngredientNode(DjangoObjectType): | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class Query(AbstractType): | class Query(AbstractType): | ||||||
|     category = Field(CategoryNode) |     category = Node.Field(CategoryNode) | ||||||
|     all_categories = DjangoFilterConnectionField(CategoryNode) |     all_categories = DjangoFilterConnectionField(CategoryNode) | ||||||
| 
 | 
 | ||||||
|     ingredient = Field(IngredientNode) |     ingredient = Node.Field(IngredientNode) | ||||||
|     all_ingredients = DjangoFilterConnectionField(IngredientNode) |     all_ingredients = DjangoFilterConnectionField(IngredientNode) | ||||||
|  |  | ||||||
|  | @ -2,5 +2,9 @@ from django.contrib import admin | ||||||
| 
 | 
 | ||||||
| from cookbook.recipes.models import Recipe, RecipeIngredient | from cookbook.recipes.models import Recipe, RecipeIngredient | ||||||
| 
 | 
 | ||||||
| admin.site.register(Recipe) | class RecipeIngredientInline(admin.TabularInline): | ||||||
| admin.site.register(RecipeIngredient) |   model = RecipeIngredient | ||||||
|  | 
 | ||||||
|  | @admin.register(Recipe) | ||||||
|  | class RecipeAdmin(admin.ModelAdmin): | ||||||
|  |   inlines = [RecipeIngredientInline] | ||||||
|  |  | ||||||
|  | @ -0,0 +1,25 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | # Generated by Django 1.9 on 2016-11-04 01:06 | ||||||
|  | from __future__ import unicode_literals | ||||||
|  | 
 | ||||||
|  | from django.db import migrations, models | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Migration(migrations.Migration): | ||||||
|  | 
 | ||||||
|  |     dependencies = [ | ||||||
|  |         ('recipes', '0001_initial'), | ||||||
|  |     ] | ||||||
|  | 
 | ||||||
|  |     operations = [ | ||||||
|  |         migrations.RenameField( | ||||||
|  |             model_name='recipeingredient', | ||||||
|  |             old_name='recipes', | ||||||
|  |             new_name='recipe', | ||||||
|  |         ), | ||||||
|  |         migrations.AlterField( | ||||||
|  |             model_name='recipeingredient', | ||||||
|  |             name='unit', | ||||||
|  |             field=models.CharField(choices=[(b'unit', b'Units'), (b'kg', b'Kilograms'), (b'l', b'Litres'), (b'st', b'Shots')], max_length=20), | ||||||
|  |         ), | ||||||
|  |     ] | ||||||
|  | @ -6,14 +6,15 @@ from cookbook.ingredients.models import Ingredient | ||||||
| class Recipe(models.Model): | class Recipe(models.Model): | ||||||
|     title = models.CharField(max_length=100) |     title = models.CharField(max_length=100) | ||||||
|     instructions = models.TextField() |     instructions = models.TextField() | ||||||
| 
 |     __unicode__ = lambda self: self.title | ||||||
| 
 | 
 | ||||||
| class RecipeIngredient(models.Model): | class RecipeIngredient(models.Model): | ||||||
|     recipes = models.ForeignKey(Recipe, related_name='amounts') |     recipe = models.ForeignKey(Recipe, related_name='amounts') | ||||||
|     ingredient = models.ForeignKey(Ingredient, related_name='used_by') |     ingredient = models.ForeignKey(Ingredient, related_name='used_by') | ||||||
|     amount = models.FloatField() |     amount = models.FloatField() | ||||||
|     unit = models.CharField(max_length=20, choices=( |     unit = models.CharField(max_length=20, choices=( | ||||||
|  |         ('unit', 'Units'), | ||||||
|         ('kg', 'Kilograms'), |         ('kg', 'Kilograms'), | ||||||
|         ('l', 'Litres'), |         ('l', 'Litres'), | ||||||
|         ('', 'Units'), |         ('st', 'Shots'), | ||||||
|     )) |     )) | ||||||
|  |  | ||||||
							
								
								
									
										32
									
								
								examples/cookbook/cookbook/recipes/schema.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								examples/cookbook/cookbook/recipes/schema.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,32 @@ | ||||||
|  | from cookbook.recipes.models import Recipe, RecipeIngredient | ||||||
|  | from graphene import AbstractType, Node | ||||||
|  | from graphene_django.filter import DjangoFilterConnectionField | ||||||
|  | from graphene_django.types import DjangoObjectType | ||||||
|  | 
 | ||||||
|  | class RecipeNode(DjangoObjectType): | ||||||
|  | 
 | ||||||
|  |     class Meta: | ||||||
|  |         model = Recipe | ||||||
|  |         interfaces = (Node, ) | ||||||
|  |         filter_fields = ['title','amounts'] | ||||||
|  |         filter_order_by = ['title'] | ||||||
|  | 
 | ||||||
|  | class RecipeIngredientNode(DjangoObjectType): | ||||||
|  | 
 | ||||||
|  |     class Meta: | ||||||
|  |         model = RecipeIngredient | ||||||
|  |         # Allow for some more advanced filtering here | ||||||
|  |         interfaces = (Node, ) | ||||||
|  |         filter_fields = { | ||||||
|  |             'ingredient__name': ['exact', 'icontains', 'istartswith'], | ||||||
|  |             'recipe': ['exact'], | ||||||
|  |             'recipe__title': ['icontains'], | ||||||
|  |         } | ||||||
|  |         filter_order_by = ['ingredient__name', 'recipe__title',] | ||||||
|  | 
 | ||||||
|  | class Query(AbstractType): | ||||||
|  |     recipe = Node.Field(RecipeNode) | ||||||
|  |     all_recipes = DjangoFilterConnectionField(RecipeNode) | ||||||
|  | 
 | ||||||
|  |     recipeingredient = Node.Field(RecipeIngredientNode) | ||||||
|  |     all_recipeingredients = DjangoFilterConnectionField(RecipeIngredientNode) | ||||||
							
								
								
									
										33
									
								
								examples/cookbook/cookbook/recipes/schema.py~
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								examples/cookbook/cookbook/recipes/schema.py~
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,33 @@ | ||||||
|  | from cookbook.ingredients.models import Recipe, Ingredient | ||||||
|  | from graphene import AbstractType, Node | ||||||
|  | from graphene_django.filter import DjangoFilterConnectionField | ||||||
|  | from graphene_django.types import DjangoObjectType | ||||||
|  | 
 | ||||||
|  | class RecipeNode(DjangoObjectType): | ||||||
|  | 
 | ||||||
|  |     class Meta: | ||||||
|  |         model = Recipe | ||||||
|  |         interfaces = (Node, ) | ||||||
|  |         filter_fields = ['name', 'ingredients'] | ||||||
|  |         filter_order_by = ['name'] | ||||||
|  | 
 | ||||||
|  | class RecipeIngredientNode(DjangoObjectType): | ||||||
|  | 
 | ||||||
|  |     class Meta: | ||||||
|  |         model = RecipeIngredient | ||||||
|  |         # Allow for some more advanced filtering here | ||||||
|  |         interfaces = (Node, ) | ||||||
|  |         filter_fields = { | ||||||
|  |             'name': ['exact', 'icontains', 'istartswith'], | ||||||
|  |             'notes': ['exact', 'icontains'], | ||||||
|  |             'recipe': ['exact'], | ||||||
|  |             'recipe__name': ['icontains'], | ||||||
|  |         } | ||||||
|  |         filter_order_by = ['name', 'recipe__name',] | ||||||
|  | 
 | ||||||
|  | class Query(AbstractType): | ||||||
|  |     recipe = Node.Field(RecipeNode) | ||||||
|  |     all_categories = DjangoFilterConnectionField(RecipeNode) | ||||||
|  | 
 | ||||||
|  |     recipeingredient = Node.Field(IngredientNode) | ||||||
|  |     all_recipeingredients = DjangoFilterConnectionField(RecipeIngredientNode) | ||||||
|  | @ -1,10 +1,11 @@ | ||||||
| import cookbook.ingredients.schema | import cookbook.ingredients.schema | ||||||
|  | import cookbook.recipes.schema | ||||||
| import graphene | import graphene | ||||||
| 
 | 
 | ||||||
| from graphene_django.debug import DjangoDebug | from graphene_django.debug import DjangoDebug | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class Query(cookbook.ingredients.schema.Query, graphene.ObjectType): | class Query(cookbook.recipes.schema.Query, cookbook.ingredients.schema.Query, graphene.ObjectType): | ||||||
|     debug = graphene.Field(DjangoDebug, name='__debug') |     debug = graphene.Field(DjangoDebug, name='__debug') | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										1
									
								
								examples/cookbook/dummy_data.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								examples/cookbook/dummy_data.json
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | [{"model": "auth.user", "pk": 1, "fields": {"password": "pbkdf2_sha256$24000$0SgBlSlnbv5c$ijVQipm2aNDlcrTL8Qi3SVNHphTm4HIsDfUi4kn9tog=", "last_login": "2016-11-04T00:46:58Z", "is_superuser": true, "username": "admin", "first_name": "", "last_name": "", "email": "asdf@example.com", "is_staff": true, "is_active": true, "date_joined": "2016-11-03T18:24:40Z", "groups": [], "user_permissions": []}}, {"model": "recipes.recipe", "pk": 1, "fields": {"title": "Cheerios With a Shot of Vermouth", "instructions": "https://xkcd.com/720/"}}, {"model": "recipes.recipe", "pk": 2, "fields": {"title": "Quail Eggs in Whipped Cream and MSG", "instructions": "https://xkcd.com/720/"}}, {"model": "recipes.recipe", "pk": 3, "fields": {"title": "Deep Fried Skittles", "instructions": "https://xkcd.com/720/"}}, {"model": "recipes.recipe", "pk": 4, "fields": {"title": "Newt ala Doritos", "instructions": "https://xkcd.com/720/"}}, {"model": "recipes.recipe", "pk": 5, "fields": {"title": "Fruit Salad", "instructions": "Chop up and add together"}}, {"model": "recipes.recipeingredient", "pk": 1, "fields": {"recipes": 5, "ingredient": 9, "amount": 1.0, "unit": "unit"}}, {"model": "recipes.recipeingredient", "pk": 2, "fields": {"recipes": 5, "ingredient": 10, "amount": 2.0, "unit": "unit"}}, {"model": "recipes.recipeingredient", "pk": 3, "fields": {"recipes": 5, "ingredient": 7, "amount": 3.0, "unit": "unit"}}, {"model": "recipes.recipeingredient", "pk": 4, "fields": {"recipes": 5, "ingredient": 8, "amount": 4.0, "unit": "unit"}}, {"model": "recipes.recipeingredient", "pk": 5, "fields": {"recipes": 4, "ingredient": 5, "amount": 1.0, "unit": "kg"}}, {"model": "recipes.recipeingredient", "pk": 6, "fields": {"recipes": 4, "ingredient": 6, "amount": 2.0, "unit": "l"}}, {"model": "recipes.recipeingredient", "pk": 7, "fields": {"recipes": 3, "ingredient": 4, "amount": 1.0, "unit": "unit"}}, {"model": "recipes.recipeingredient", "pk": 8, "fields": {"recipes": 2, "ingredient": 2, "amount": 1.0, "unit": "kg"}}, {"model": "recipes.recipeingredient", "pk": 9, "fields": {"recipes": 2, "ingredient": 11, "amount": 2.0, "unit": "l"}}, {"model": "recipes.recipeingredient", "pk": 10, "fields": {"recipes": 2, "ingredient": 12, "amount": 3.0, "unit": "st"}}, {"model": "recipes.recipeingredient", "pk": 11, "fields": {"recipes": 1, "ingredient": 1, "amount": 1.0, "unit": "kg"}}, {"model": "recipes.recipeingredient", "pk": 12, "fields": {"recipes": 1, "ingredient": 3, "amount": 1.0, "unit": "st"}}, {"model": "ingredients.category", "pk": 1, "fields": {"name": "fruit"}}, {"model": "ingredients.category", "pk": 3, "fields": {"name": "xkcd"}}, {"model": "ingredients.ingredient", "pk": 1, "fields": {"name": "Cheerios", "notes": "this is a note", "category": 3}}, {"model": "ingredients.ingredient", "pk": 2, "fields": {"name": "Quail Eggs", "notes": "has more notes", "category": 3}}, {"model": "ingredients.ingredient", "pk": 3, "fields": {"name": "Vermouth", "notes": "", "category": 3}}, {"model": "ingredients.ingredient", "pk": 4, "fields": {"name": "Skittles", "notes": "", "category": 3}}, {"model": "ingredients.ingredient", "pk": 5, "fields": {"name": "Newt", "notes": "Braised and Confuesd", "category": 3}}, {"model": "ingredients.ingredient", "pk": 6, "fields": {"name": "Doritos", "notes": "Crushed", "category": 3}}, {"model": "ingredients.ingredient", "pk": 7, "fields": {"name": "Apple", "notes": "", "category": 1}}, {"model": "ingredients.ingredient", "pk": 8, "fields": {"name": "Orange", "notes": "", "category": 1}}, {"model": "ingredients.ingredient", "pk": 9, "fields": {"name": "Banana", "notes": "", "category": 1}}, {"model": "ingredients.ingredient", "pk": 10, "fields": {"name": "Grapes", "notes": "", "category": 1}}, {"model": "ingredients.ingredient", "pk": 11, "fields": {"name": "Whipped Cream", "notes": "", "category": 3}}, {"model": "ingredients.ingredient", "pk": 12, "fields": {"name": "MSG", "notes": "", "category": 3}}] | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user