2010-12-31 3 views
3

먼저 Google 애플리케이션 엔진에서 프로젝트를 실행할 계획이므로 djangoappengine을 사용하고 있으며 장고의 ManyToManyField 유형은 지원하지 않습니다. 이런 이유로 나는 한 설정의 내 모델 : 페이지에Django의 many to many 관계에 레코드를 추가하는 올바른 방법

from django.db import models 
from django.contrib.auth.models import User 

class Group(models.Model): 
    name = models.CharField(max_length=200) 

class UserGroup(models.Model): 
    user = models.ForeignKey(User) 
    group = models.ForeignKey(Group) 

나는 사람들이 그룹 이름을 입력 할 수있는 양식 필드를 가지고있다. 이 양식 필드의 결과에서 사용자 그룹 조합에 대한 UserGroup 객체를 만들고 그룹이 아직 존재하지 않으면 새 그룹 객체를 만들길 원합니다. 처음에이 논리를 add_group 메서드로 UserGroup 클래스에 넣기 시작했지만 UserGroup 클래스에이 논리를 넣는 것이 실제로 의미가 없다는 것을 빨리 알게되었습니다. 이 일을하는 올바른 방법은 무엇입니까? 모델 매니저에 대한 몇 가지 정보를 보았습니다. 그게 그 사람들을위한 것입니까? Django docs에서

답변

3

:

관리자 그래서 관리자가 모델의 새로운 인스턴스를 만들 수있는 방법이 아니다 데이터베이스 쿼리 작업이 장고 모델

에 제공되는 인터페이스입니다.

키워드 인수에서 User (주어진 경우)을 가져오고 새 UserGroup을 생성하는 Group 모델의 생성자가 있습니다.

그래서 당신은 새로운 GroupGroup(name='group name', user=some_user)으로 생성자와 적절한 UserGroup을 멀리 user 키워드 인수를 제거하고 만들 수있는 인스턴스 경우 그 user :

class Group(models.Model): 
    name = models.CharField(max_length=200) 

    def __init__(self, *args, **kwargs): 
     # Remove user from the kwargs. 
     # It is important that user is removed from the kwargs before calling 
     # the super.__init__(). This is because the `user` kwarg is not expected. 
     user = kwargs.pop('user', None) 

     # call the normal init method 
     super(Group, self).__init__(*args, **kwargs) 

     # Create the UserGroup instance for the specified user 
     if user is not None: 
      # Maybe some other logic here ... 
      UserGroup(user=user, group=self).save() 

당신의 Group를 인스턴스화 할 때 당신이 user를 제공하는 경우이 방법이 UserGroup이 작성되고 달리 수행되지 않습니다.

물론 UserGroup 모델의 생성자에서 똑같은 작업을 수행 할 수 있습니다. 실제로 중요한 것은 아니며, 은유 적으로 코드에 의미가 있는지 여부에 달려 있습니다.

편집 : 문제

수정 사항은 댓글에서 지적 :

... 
def __init__(self, *args, **kwargs): 
    ... 
    self._user_group = UserGroup(user=user, group=self) 

def save(self, *args, **kwargs): 
    super(Group, self).save(*args, **kwargs) 
    self._user_group.save() 
+0

어떻게 할 수 그것 자체에는 그룹이 아직이없는 M2M? 어쩌면 나는 그것을 잘못 읽었을 것입니다. 모두 읽지는 않았어. –

+0

해결책을 제안하는 답을 편집했습니다. –

+0

그것은 내가 hehe를 의미했던 것이다. 그러나 그것은 우아한 방법입니다! 내가 잘못 입력 한 것은 아직 그룹이 없을 때 m2m을 어떻게 저장할 수 있는지를 의미합니다. –

관련 문제