Pycharm으로 manage.py startrunserver나


아니면 자체적으로 서버를 런할경우


자꾸 Process Exit (0) 이러면서 꺼지는경우가 있는데;


이것은 마소자체적인 버그라고 한다;


아래처럼 설정해주면 해당 에러가 나지 않는다.



Posted by C마노
,

* Abstract Base Class

   

   - 어떠한 공통적인 필드를 여러 모델에 삽입하려는 경우에 유용

   - 실제로 테이블을 생성하지 않음

   - 기본 클래스를 작성후에 그안에 Meta 클래스 작성후 abstract=True 를 넣어줌

   - 부모필드 ( 즉 여기선 abstract Class Model ) 과 같은 이름을 가지는 자식클래스의 안의 필드를 정의 할 수 없습니다.


from django.db import models

class CommonInfo(models.Model):
    name = models.CharField(max_length=100)
    age = models.PositiveIntegerField()

    class Meta:
        abstract = True

class Student(CommonInfo):
    home_group = models.CharField(max_length=5)

여기서 Student 는 name, age, home_group의 필드를 가집니다.

그리고 Student는 name과 age를 정의할 수 없다는 뜻입니다.


최대의 장점으로는 자식 모델당 하나의 데이터베이스 테이블만 생성하면서 Python 레벨에서 공통적인 정보를 제외시킬수 있다는 점입니다.


자식 클래스가 자신의 Meta 클래스를 선언하지 않으면, 부모클래스의 Meta를 상속 받습니다.  자식이 부모의 Meta 클래스를 확장하려고 하면 아래와 같이합니다.


from django.db import models

class CommonInfo(models.Model):
    # ...
    class Meta:
        abstract = True
        ordering = ['name']

class Student(CommonInfo):
    # ...
    class Meta(CommonInfo.Meta):
        db_table = 'student_info'

[Multi table 상속]


Django 가 지원하는 모델 상속의 두번째 유형은 계층 구조의 각 모델이 모두 하나의 모델일때 입니다.

이 방법은 복잡하고, 느리므로 최대한 사용하지 않는 것을 권장합니다.


각 모델은 자체 데이터베이스 테이블에 해당하며 개별적으로 쿼리하고 생성 할 수 있습니다.


from django.db import models

class Place(models.Model):
    name = models.CharField(max_length=50)
    address = models.CharField(max_length=80)

class Restaurant(Place):
    serves_hot_dogs = models.BooleanField(default=False)
    serves_pizza = models.BooleanField(default=False)

Place의 모든 필드는 Restaurant에서 사용 할 수 있고, 데이터는 다른 데이터베이스 테이블에 저장됩니다. 그래서 둘다 가능.


[ Proxy Model ]


다중 테이블 상속을 사용할 때 모델의 각 하위 클래스에 대해서 새로운 데이터 베이스 테이블을 생성하는 방법입니다. 


프록시의 제일큰 특정은 원본을 변경하지 않고 프록시에서 기본 모델 순서 또는 기본 관리자와 같은 것을 변경할 수 있다는 것입니다.


from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

class MyPerson(Person):
    class Meta:
        proxy = True

    def do_something(self):
        # ...
        pass

여기서 보면 MyPerson 클래스는 상위 Person 클래스와 동일한 데이터 베이스 테이블에서 작동합니다. 특히 Person의 새 인스턴스는 MyPerson을 통해 엑세스 할 수 있으며, 그 반대의 경우도 가능하다는 것입니다.


>>> p = Person.objects.create(first_name="foobar")
>>> MyPerson.objects.get(first_name="foobar")
<MyPerson: foobar>

또한 프록시 모델을 사용해서 모델에서 원본모델에서 사용하는 ordering을 정의할 수도 있습니다. 


class OrderedPerson(Person):
    class Meta:
        ordering = ["last_name"]
        proxy = True


Posted by C마노
,

[파이썬 스타일]


1. 파이썬 파일은 들여쓰기에 space 4칸을 사용하십시오. HTML은 2칸을 사용합니다.


2. 따로 명시가 되어있지 않는 한은 PEP8을 따릅니다.


flake8을 사용해서 문제가 있는 코드를 확인하고, 특히 하나가 PEP8이랑 다른데 바로 79길이제한입니다.


코드줄을 79로 제한할 필요는 없습니다. 79자의 코드 길이는 GitHub 코드를 볼때 최적화된 너비이므로 Django에서는 119자까지 허용합니다. 


3. 들여쓰기에는 4개의 스페이스를 사용하세요


4. 변수, 함수 및 메소드 이름은 camelCase가 아닌 밑줄을 사용하시기 바랍니다.


poll.getUniqueVoters (X)

poll.get_unique_voters 가 맞습니다.


5. 클래스 이름에는 첫글자를 대문자로 사용합니다.


6. DocString은 꼭 사용하는걸로 합시다.


def foo():
    """
    Calculate something and return the result.
    """
    ...


7. testCode에서는 assetRaises() 대신에, assertRaisesMessage()를 사용해서 예외 메세지를 확인할 수 있습니다. 


[임포트]


1. isort를 사용해서 import 정렬을 자동화하시기 바랍니다.


$ pip install isort
$ isort -rc .

만약, 특별한 경우에 import 정렬이 필요없다고 생각되신다면 

아래의 방침을 따라하십시오.


import module  # isort:skip

2. import를 쓰기전에는 항상 from을 사용하시기를 바랍니다.

import module이 아닌 from module import objects가 맞는겁니다.


3. import 시에는 무조건 상대적 가져오기가 맞는겁니다.

import corn from xx 가아닌.

import . from xx 가 맞습니다.


4. 만약 긴줄의 import가 필요하다면 아래와같이 하십시오. 


from django.http.response import (
    Http404, HttpResponse, HttpResponseNotAllowed, StreamingHttpResponse,
    cookie,
)

import 마지막에는 , 를 포함해야 하고, 닫는 괄호는 마지막 줄에 넣습니다.


5. 마지막 import와 module 코드 사이에는 빈줄 하나를 사용하고 첫번째 함수 또는 클래스위에 빈줄 2개를 사용하시기 바랍니다.


전체적인 예입니다.


# future
from __future__ import unicode_literals

# standard library
import json
from itertools import chain

# third-party
import bcrypt

# Django
from django.http import Http404
from django.http.response import (
    Http404, HttpResponse, HttpResponseNotAllowed, StreamingHttpResponse,
    cookie,
)

# local Django
from .models import LogEntry

# try/except
try:
    import pytz
except ImportError:
    pytz = None

CONSTANT = 'foo'


class Example(object):
    # ...

6. 가능한 한, 편리한 임포트 방식을 사용하십시오.


from django.views.generic.base import View

위의 방법 대신


from django.views import View

위의방법이 더 좋습니다.


[템플릿 스타일]


{{foo}}

위의 방법은 안되고,

{{ foo }}

위의 방법을 사용하십시오.


[뷰 스타일]


1. 항상 첫번째 파라미터는 request입니다. 명심하세요.


def my_view(request, foo):
    # ...

맞는방식이고


def my_view(req, foo):
    # ...

잘못된 방식입니다.


[모델 스타일]


1. 필드 이름은 모두 소문자 이어야만 하고, camelCase 대신에 밑줄을 사용해야합니다.


class Person(models.Model):
    first_name = models.CharField(max_length=20)
    last_name = models.CharField(max_length=40)

아래는 잘못된 예입니다.

class Person(models.Model):
    FirstName = models.CharField(max_length=20)
    Last_Name = models.CharField(max_length=40)


2. 메타 클래스는 필드가 다 정의 되고 난다음에 작성되어야 하고, 필드와 클래스를 정의를 구분하는 하나의 빈줄이 필요합니다.


아래는 정상적인방식


class Person(models.Model):
    first_name = models.CharField(max_length=20)
    last_name = models.CharField(max_length=40)

    class Meta:
        verbose_name_plural = 'people'

아래는 안됩니다.


class Person(models.Model):
    first_name = models.CharField(max_length=20)
    last_name = models.CharField(max_length=40)
    class Meta:
        verbose_name_plural = 'people'

아래도 안됩니다.


class Person(models.Model):
    class Meta:
        verbose_name_plural = 'people'

    first_name = models.CharField(max_length=20)
    last_name = models.CharField(max_length=40)


3. [이거는 꼭 해야되는지 모르겠는데 사실 PYTHON3 만 쓰겟다! 하면 안해도됩니다.]

__str__ method를 사용했다면

python_2_unicode_compatible() 을 사용해서 모델을 꾸미세요.


4. 모델의 내부 클래스와 표준 메소드의 순서는 다음과 같아야 합니다. 


[1] 모든 db 필드

[2] 커스텀 매니저 속성들

[3] 메타클래스

[4] def __str__()

[5] def save()

[6] def get_absolute_url()

[7] 다른 커스텀 메소드들


5. 만약 choice 필드를 사용한다면, 모델의 클래스 속성으로 대문자 이름을 가진 튜플의 튜플로 각 선택사항을 정의해야합니다.


아래의 예를보세요


class MyModel(models.Model):
    DIRECTION_UP = 'U'
    DIRECTION_DOWN = 'D'
    DIRECTION_CHOICES = (
        (DIRECTION_UP, 'Up'),
        (DIRECTION_DOWN, 'Down'),
    )

[django.conf.settings]


모듈은 일반적으로 django.conf.settings에 저장된 설정을 최상위 레벨에서 사용하지 말아야 합니다.


[기타 잡다한것]


1. 국제화를 위해서 모든 국제 문자를 지원하십시오.i18n 설명서를 참조하세요


2. 사용하지 않는 import 는 제거하십시오.


3. 제발 코드에 이름을 넣지마십시오 이것은 굉장히 멍청한 짓입니다. 

Posted by C마노
,