ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • django 입문(5) Model 2) 추가 기능
    Backend/Django 2023. 9. 17. 23:48

    filter()

    공식 문서: https://docs.djangoproject.com/en/4.0/topics/db/queries/

    django.db.models.Model.objects 의 멤버 함수.

    parameter로 전달되는 조건을 충족하는 Object를 담고 있는 QuerySet 을 반환한다. 만약 조건을 충족하지 못하면 빈 QuerySet을 반환한다. (<QeurySet[~]>

     

    Foreign Key로 다른 model 을 사용할 때 사용할 수 있는 속성

    Model A와 B가 있을 때 Model B의 Foreign Key가 A 객체를 가리키면, Model A 객체에서는 a.b_set(a는 객체명, b Model B의 이름을 소문자로 바꾼 것.) 의 사용이 가능하다. 즉 Model A 객체에서 자신을 Foreign Key 로 사용하는 다른 Model 객체에 접근할 수 있게 된다.

     

    Model에 사용자를 의미하는 속성 추가

    1. Model 객체에 author 처럼 사용자를 의미하는 속성을 author=models.ForeignKey(User, on_delete=models.CASACADE) 로 추가(User는 django.contrib.auth.models에 있는 Model 클래스)
    2. model이 수정이 발생하였으므로 python3 manage.py makemigrations 실행

    이미 만들어진 model 객체가 존재하므로 이 객체들에 새로 추가된 속성의 값을 정해야 함. 따라서 option을 선택하라는 메시지 발생. 1번은 default로 사용할 값을 직접 지정하는 방식, 2번은 default로 null을 사용하는 방식.

    1번을 선택하면 장고 prompt가 실행됨. 여기서 바로 속성 값으로 추가할 객체의 id를 입력.

    1. 모델 생성 함수(views.py에 있을 확률이 높다.) 를 새 속성을 추가하도록 수정

    사용자 객체는 request.user 처럼 접근 가능. ex) author = request.user

    단, request.user로 접근하려면 해당 함수가 호출될 때 반드시 login된 상태이어야 함.(login되지 않은 상태에서 함수가 호출되면 request.user에는 AnonymousUser 객체가 들어가고 예시로 들었던 author는 models.ForignKey에서 ‘User’ 객체를 갖도록 선언하였으므로 Error가 발생함.) 따라서 함수 호출 전에 login된 상태가 아니라면 login 화면으로 전환되도록 수정 필요

    1. 반드시 login되어야만 사용이 가능한 함수 앞에 @login_required(login_url='common:login') 을 추가.(parameter는 login을 위해 이동할 URL) @login_required 애너테이션은 django.contrib.auth.decorators에 존재한다.
    2. 4)번 과정에 의해 login 화면으로 전환된 브라우저는 login 완료 후 다시 이전에 진짜 사용하려고 했던 기능 페이지로 되돌아가야 함. 이를 위해 login 템플릿 파일(ex) login.html)에 <input type=”hidden” name=”next” value=”{{ next }}” >를 추가해야 함.

    <inpuit type=”hidden”> 은 원래 화면에는 표시되지 않지만 브라우저가 서버로 요청을 보낼 때 함께 보낼 Data를 담도록 되어 있음. Django에서는 django.contrib.auth.view.login 에서 hidden input 태그를 이용해 {{ next }}에 login 후 리다이렉트될 URL을 저장했다가 login이 성공하면 그 페이지로 리다이렉트 하도록 함.

     

    역참조

    모델의 속성이 다른 모델을 외래 키로 참조할 경우(ForeignKey, ManyToManyField(다대다 관계) …), 참조된 모델은 역으로 자신을 참조하고 있는 모델 객체에 접근이 가능하다. 이를 역참조라고 한다.

    역참조하는 방법은 {model_classname}_set 속성을 사용하는 것이다. (model 명은 자동으로 소문자로 바뀜)

    class Question(models.Model):
    	author = ForeignKey(User)
    ---------------------------------------------------------------------------
    >>> {User_object}.question_set.all()  # User 객체에서 Queston 객체로 역참조
    

    2개 이상의 속성이 동일한 Model을 참조할 경우, 역참조에서 Error가 발생한다.

    SystemCheckError: System check identified some issues: ERRORS: pybo.Question.author: (fields.E304) Reverse accessor for 'pybo.Question.author' clashes with reverse accessor for 'pybo.Question.voter'. HINT: Add or change a related_name argument to the definition for 'pybo.Question.author' or 'pybo.Question.voter'. pybo.Question.voter: (fields.E304) Reverse accessor for 'pybo.Question.voter' clashes with reverse accessor for 'pybo.Question.author'. HINT: Add or change a related_name argument to the definition for 'pybo.Question.voter' or 'pybo.Question.author'.

    역참조 시 기준이 될 속성이 불분명하기 때문.

     

    해결책은 "related_name" parameter를 추가하는 것.

    그러면 역참조 기준이 명확해져서 ({user}.author_question.all() 처럼 User 객체에서 Question 객체로 역참조할 수 있다. {model_object}.{related_name}

    class Question(models.Model):
    # ...(생략)
        author = models.ManyToMany(User, related_name="author_question")
        voter = models.ManyToMany(User, related_name="voter_question")
    ------------------------------------------------------------------------
    >>> user.author_question.all() 
    

     

    배프의 오지랖 파이썬 웹프로그래밍: https://www.yes24.com/Product/Goods/69758579

     

    배프의 오지랖 파이썬 웹프로그래밍 - 예스24

    기초부터 실전 웹 서비스까지 다 담았다!현직 개발자이자 IT강사인 배프의 강의와 실무를 통해 쌓은 노하우를 한 단계식 알려드립니다. 현 웹 프로그래밍 시장은 다양한 기술을 활용하여 얼마나

    www.yes24.com

    'Backend > Django' 카테고리의 다른 글

    class Meta  (2) 2023.09.18
    django 입문(5) Model 3) DB에 Table 생성  (0) 2023.09.17
    django 입문 (7) 템플릿 파일  (0) 2023.08.02
    django 입문(6) 장고관리자 admin  (0) 2023.07.12
    django 입문(5) Model 1) 기본 사용법  (0) 2023.07.10

    댓글

Designed by Tistory.