728x90
반응형

import random


  • random() : 0 이상 1 미만의 실수 난수 생성
  • randrange(a, b, c) : a가 시작점, b가 끝점(포함 x), c는 간격(step). 간격은 필수 아님
  • choice() : 하나 골라줌
  • shuffle() : 시퀀스 객체를 셔플 시켜줌

lambda, map, reduce, filter


# lambda 매개변수 : 표현식
def multi(x, y):
    return x * y

if multi(2, 4) == (lambda x, y: x * y)(2, 4):
    print('결과가 똑같아용')

# map(함수, 리스트)
print(list(map(lambda x: x ** 3, range(3))))  # [0, 1, 8] 출력

# reduce(함수, 순회 가능한 데이터[, 초기값]) -> 누적 집계
from functools import reduce

r = reduce(lambda x, y: x + y, range(5))
print(r)  # 10 출력

users = [{'mail': 'gregorythomas@gmail.com', 'name': 'Brett Holland', 'sex': 'M', 'age': 73},
         {'mail': 'hintoncynthia@hotmail.com',
             'name': 'Madison Martinez', 'sex': 'F', 'age': 29},
         {'mail': 'wwagner@gmail.com', 'name': 'Michael Jenkins', 'sex': 'M', 'age': 51},
         {'mail': 'daniel79@gmail.com',
             'name': 'Karen Rodriguez', 'sex': 'F', 'age': 32},
         {'mail': 'ujackson@gmail.com', 'name': 'Amber Rhodes', 'sex': 'F', 'age': 42}]

sum_age = reduce(lambda acc, cur: acc + cur["age"], users, 0)
print(sum_age)

# filter(함수, 순회 가능한 데이터) -> 원소를 함수에 적용시켜 결과가 참인 값들을 걸러낸다.
f = filter(lambda x : x < 5, range(10))
print(list(f)) # [0, 1, 2, 3, 4] 출력

Django 복습 - 요새 기존에 알던 것도 공식 문서로 다시 공부 중입니당

verbose_name


  • verbose_name is a human-readable name for the field.
  • If the verbose name isn’t given, Django will automatically create it using the field’s attribute name, converting underscores to spaces.
  • This attribute in general changes the field name in admin interface.
  • 요약 : 필드 이름을 인간이 읽기 쉽도록 바꿈. 안 쓰면 기본적으로 속성 이름 따라감(공백은 ‘_’로 치환)

related_name → 참고 docs


  • 모델이 외래키로 참조’되고’ 있을 때, 해당 모델은 FOO_set을 통해 관련 모델의 필드를 반환하는 Manager에 접근할 수 있다.
  • 이때 FOO는 소스가 되는 모델의 소문자 이름이다.
  • 또는 FOO_set 대신 related_name으로 따로 이름을 지정해줄 수도 있다.
  • 해당 Manager는 QuerySets을 반환한다.
from datetime import date
from django.db import models

class Blog(models.Model) :
    name = models.CharField(max_length = 100)
    tagline = models.TextField()

    def __str__(self) :
        return self.name

class Entry(models.Model) :
    blog = models.ForeignKey(Blog, on_delete = models.CASCADE)
    headline = models.CharField(max_length=255)

b = Blog.objects.get(id=1)
b.entry_set.all() # b와 연관된 모든 Entry 객체를 들고 온다.
  • 만약 blog = models.ForeignKey(Blog, on_delete = models.CASCADE, related_name = 'entries')로 설정돼있을 경우 b.entries.all()로 가져올 수 있다.
  • Django가 역방향 관계(Backwards relation)를 생성하지 않길 원한다면 related_name을 '+'로 설정하거나 '+ '+'로 끝내면 된다. (아래 예시)
class Entry(models.Model) :
    blog = models.ForeignKey(Blog, on_delete = models.CASCADE, related_name = "+", )
    # Blog 모델이 역방향 관계를 갖지 않도록 한다.
  • QuerySet의 kwarg로도 활용할 수 있다. 즉 reverse filter name으로 쓸 수 있다.

related_query_name


  • 타겟 모델의 reverse filter name으로 사용하는 이름
  • if set 따로 지정하지 않을 경우 related_name이나 default_relaged_name과 동일하다(→_set). otherwise 모델 이름으로 설정된다/
  • related_name처럼 app label과 class interpolation을 지원한다.

related_name과 related_query_name 사용 시 주의할 점 → 참고 docs%3A%0A%20%20%20%20%20%20%20%20pass-,Be%20careful%20with%20related_name%20and%20related_query_name,-%C2%B6)


  1. 추상 기본 클래스(abstract base classes)의 필드는 매번 속성값(attribute, related_name과 related_query_name 포함)을 똑같이 가지고 각각의 자식 클래스에 포함된다.
  2. 따라서 외래키나 ManyToManyField를 가진 추상 기본 클래스(abstract base classes)를 상속받을 경우 항상 related_name 또는 related_query_name 속성값이 동일한 문제가 발생할 수 있다. (migrate할 때 에러가 나버릴지도~)
  3. 그러므로 외래키나 ManyToManyField에서 related_name 또는 related_query_name 사용하는 경우, 필드의 고유한(unique) reverse name과 query name 필수로 지정해주어야 한다.
  4. 이때 %(app_label)s과 %(class)s를 활용한다.
    • %(class)s : 해당 필드가 사용되는 자식 클래스의 소문자(lower-cased) 이름.
    • %(app_label)s : 자식 클래스가 포함돼있는 앱의 소문자(lower-cased) 이름. 이때 각 앱과 앱 내 모델 클래스의 이름이 모두 unique해야 이름이 다르게 나온다.
  5. 예시
from django.db import models

class Base(models.Model):
    m2m = models.ManyToManyField(
        OtherModel,
        related_name="%(app_label)s_%(class)s_related",
        related_query_name="%(app_label)s_%(class)ss",
    )

    class Meta:
        abstract = True

class ChildA(Base):
    pass

class ChildB(Base):
    pass
  • The reverse name of the common.ChildA.m2m field will be common_childa_related and the reverse query name will be common_childas. (누가 내 블로그를 볼까 싶어서 굳이 한글로 해석하진 않았다../)
  • The reverse name of the common.ChildB.m2m field will be common_childb_related and the reverse query name will be common_childbs.
  • Finally, the reverse name of the rare.ChildB.m2m field will be rare_childb_related and the reverse query name will be rare_childbs.

related_name&related_query_name요약



  1. related_name은 일대다 관계에서 1인 모델 인스턴스가 관계된 多 모델의 객체를 가져올 때 사용한다.
  2. related_name은 모델 인스턴스의 속성처럼 활용 가능하고, 따로 related_query_name을 지정하지 않을 경우 QuerySet의 kwarg로도 사용 가능하다.
  3. 만약 자식 클래스가 존재할 경우 %(app_label)s과 %(class)s를 활용해 고유한(unique) reverse name과 query name을 지정해 주어야 related_name 또는 related_query_name 속성값이 동일한 문제를 방지할 수 있다.

 

 

오늘 기분 나쁜 일 있어서 뒤지게 공부만 했더니 스트레스가 좀 풀렸다.

슬픈 감정이든 빡침이든 부정적인 감정이 올라올 때는 일부러 나를 바쁘게 만든다.

이런 점에서 가끔은 짜잘하게 나쁜 일이 있는 것도 나쁘지 않아~~

덕분에 영어 공부랑 일본어 공부도 하고 코딩 공부까지 하루에 다 할 수 있었다.

반응형

+ Recent posts