2014-09-17 2 views
0

У меня есть следующие моделисоздание модели с foreingn ключей с использованием базы Джанго Rest

class Parent(models.Model): 
    address = models.CharField(max_length=30, blank=True, null=True) 
    address_no = models.CharField(max_length=4, blank=True, null=True, verbose_name="No") 
    phone = models.CharField(max_length=15, blank=True, null=True, verbose_name="Phone Number") 
    user = models.OneToOneField(User) 

    class Meta: 
     verbose_name_plural = "Parents" 
     verbose_name = "Parent" 

    def __unicode__(self): 
     return "%s %s" % (self.user.first_name, self.user.last_name) 


class Child(models.Model): 
    age = models.IntegerField(blank=True, null=True) 
    grade = models.IntegerField(blank=True, null=True) 
    user = models.OneToOneField(User) 
    parent = models.ForeignKey(Parent, related_name="children") 

    class Meta: 
     verbose_name = "Child" 
     verbose_name_plural = "Children" 

    def __unicode__(self): 
     return "%s %s" % (self.user.first_name, self.user.last_name) 

Так что разные типы пользователей в моей системе (родители и дети). Я реализую их, используя отношение к модели User, потому что у родителей есть разные поля от Children. (Дополнительно: есть лучший способ сделать это?)

Я также реализовал Сериализую для этих моделей в моем отдыхе апи

serializers.py

class UserSerializer(serializers.HyperlinkedModelSerializer): 

    class Meta: 
     model = User 
     fields = ('id', 'url', 'username', 'email', 'groups') 


class GroupSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Group 
     fields = ('url', 'name') 


class ParentSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Parent 


class ChildSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Child 

и использовал viewsets для генерации просмотров за апи и функциональность

views.py

class UserViewSet(viewsets.ModelViewSet): 
    queryset = User.objects.all() 
    serializer_class = UserSerializer 
    filter_fields = ('username', 'email', 'first_name', 'last_name') 


class GroupViewSet(viewsets.ModelViewSet): 
    queryset = Group.objects.all() 
    serializer_class = GroupSerializer 



class ParentViewSet(viewsets.ModelViewSet): 
    queryset = Parent.objects.all() 
    serializer_class = ParentSerializer 


class ChildViewSet(viewsets.ModelViewSet): 
    queryset = Child.objects.all() 
    serializer_class = ChildSerializer 

и настроить URLs

urls.py

router = routers.DefaultRouter() 
router.register(r'users', views.UserViewSet) 
router.register(r'groups', views.GroupViewSet) 
router.register(r'parents', views.ParentViewSet) 
router.register(r'children', views.ChildViewSet) 


urlpatterns = patterns('', 
    # Examples: 
    url(r'^api/', include(router.urls)), 
    url(r'api-auth/', include('rest_framework.urls', namespace='rest_framework')), 
) 

Так пост в/API/родители создать новый родительский object.But это обыкновение создавать объект пользователя, который необходим для модели Parent. Один из способов состоит в том, чтобы сделать 2 api вызывает одну из них/api/users/a post и создать нового пользователя, а затем получить идентификатор нового пользователя и использовать его для публикации в/api/parents. Я бы хотел этого избежать. Есть ли способ сделать это, создав нового родителя из api. Как я могу также вернуть first_name и last_name пользователя в виде списка родителей (api/parents /). Теперь он возвращает URL-адреса соответствующего пользователя, но ни один из его полей

+0

У пользователей Imho должны быть контакты и сведения об окончании. Я думаю, не у каждого ребенка есть родитель. : S Отношения должны поддерживаться в другой таблице imho. Но текущего решения может быть достаточно ... – inf3rno

ответ

0

Таким образом, у меня есть разные типы пользователей в моей системе (родители и детей). Я реализую их, используя отношение к модели пользователя , потому что у родителей есть разные поля от Children. (дополнительно: есть лучший способ сделать это?)

Я предпочел бы использовать обратный подход.

Person 
    Profile 
    Contact 
    Graduation 

ParentChildRelationship 
    Parent (Person) 
    Child (Person) 

Но я думаю, что это вопрос вкуса.

Так пост в/API/родители создать новый родительский object.But это обыкновение создать объект пользователя, который необходим для модели Parent. Один из способов: - сделать 2 api, называет один из них/api/users/a post и создавать нового пользователя и , а затем получить идентификатор нового пользователя и использовать его для публикации в/api/parents. Я бы хотел, чтобы этого избежать. Есть ли способ сделать это при создании нового родителя изнутри api.

С помощью REST вы всегда можете создать новый ресурс для любой цели. Например, если вы хотите создать ресурсы A и B сразу, вы можете определить ресурс C, который может создавать оба одновременно. Это все равно, читая.

В вашем текущем случае вам не нужно определять новый ресурс. Пользователь является встроенным ресурсом родителя и дочернего элемента. Поэтому вам нужно отправить представление, которое содержит этот встроенный ресурс. Обычно {user: {}} в обычном JSON.Вероятно, вы не можете решить эти проблемы с помощью ваших текущих инструментов. Поскольку у меня нет подсказки о django и python, я не могу больше помочь.

Смежные вопросы