Django Error – ‘module’ object is not callable 오류

오류가 아래와 같이 발생했다.

File “C:\Users\User1\Documents\Work\tx-msa-test-service\django\app_test_data_manager\api_v1\apis\api_order.py”, line 100, in post_order
start = time()
TypeError: ‘module’ object is not callable

무슨 에러인가

여기 저기 찾다가 이게 특별한 에러가 아니었고,

import time

이라는 문장을 어떤 파일에 실수로 위쪽에 집어 넣었는데, 이 이후 부터 발생하기 시작했다.

에러만 보고는 알수 없는 아주 이상한 에러.

자꾸 코드를 이상하게 수정할 뻔, 실수를 유의하자

C/C++ 와 다르게 인터프리트 비슷한 언어는 실수를 잘 못잡아 낼 경우가 많다.

Django – FileField upload_to 커스텀

아래 처럼 함수를 이용하여 업로드 위치를 지정할 수 있다. 실행타임 즉 런타임에 폴더 위치를 변경할 수 있다는 말이다.

그럼 과연 django에는 upload_to를 어떻게 커스텀해서 적용할까?

이하 django filefield 예시

def user_directory_path(instance, filename):
    <em># file will be uploaded to MEDIA_ROOT/user_<id>/<filename></em>
    return 'user_{0}/{1}'.format(instance.user.id, filename)

위와 같이 instance와 filename가 넘어오는데 instance는 model에서 생성된 instance 내용물들을 말한다

그래서 그 내용물의 필드들, 왜래키의 필드들에 접근할 수 있다.

모델에는 다음과 같이 설정한다.

class Content(models.Model):
    name = models.CharField(max_length=200)
    user = models.ForeignKey(User)
    file = models.FileField(upload_to=user_directory_path)

참고자료

https://stackoverflow.com/questions/1190697/django-filefield-with-upload-to-determined-at-runtime

https://mixedprograming.tistory.com/26

Django – JSONFields 사용법 orm

편리하게 사용할 수 있는 JSONFields 사용법

PostgreSQL 데이터베이스는 지원하는 타입으로 옵션 필드 처리를 위해 사용한다.

사용법은 아래 내용 참고.

https://ianjang.github.io/django-orm-postgresql-jsonfield%EC%97%90-%EB%8C%80%ED%95%B4-exclude-%EA%B5%AC%EB%AC%B8-%EC%82%AC%EC%9A%A9%EC%8B%9C-%EC%A3%BC%EC%9D%98%EC%82%AC%ED%95%AD/#json-field-%ED%95%84%ED%84%B0%EB%A7%81-%ED%85%8C%EC%8A%A4%ED%8A%B8

https://awstip.com/querying-djangos-jsonfield-a2914f5d4b91

선언부

class Book(models.Model):
    <em># (...생략...)</em>
    data = JSONField(null=True, blank=True)

데이터 생성

class TestJsonFieldFiltering(TestCase):
    def setUp(self):
        Book.objects.create(id=1, data=None)
        Book.objects.create(id=2, data={})
        Book.objects.create(id=3, data={'title': 'django'})
        Book.objects.create(id=5, data={'title': 'django', 'is_published': True})

활용법

  • 키값이 있는지 조사 __has_key

Results in the query:

<strong>r = Person.objects.filter(data__has_key="name").all()</strong>

  • Contain

r = Person.objects.filter(data__contains={“name”: “Peter”}).all()

Assuming a Person had the following data

<strong><em>data = {“name”:"Peter”, “classes”: ["MATH", "ENG", "SCI"]}</em></strong>

We can answer the question, Does the student take “MATH” classes?

<strong>r = Person.objects.filter(data__classes__contains=["MATH"]).all()</strong>

  • 필터링 조건

<em># is_published=True 조건 조회 시, 아래 두 ORM 구문 모두 예상한 결과가 나옵니다.</em>
Book.objects.filter(data__is_published=True) <em># O</em>
Book.objects.filter(Q(data__is_published=True) & Q(data__is_published__isnull=False)) <em># O</em>

<em># is_published=False 조건 조회 시, 아래 두 ORM 구문 모두 예상한 결과가 나옵니다. </em>
Book.objects.filter(data__is_published=False) <em># O</em>
Book.objects.filter(Q(data__is_published=False) & Q(data__is_published__isnull=False)) <em># O</em>

<em># is_published=True 만 제외하고 조회하려면 주의가 필요합니다. (예상 결과: 1, 2, 3, 4, 7, 8)</em>
Book.objects.exclude(data__is_published=True) <em># 예상과 다르 결과가 나옵니다.</em>
Book.objects.exclude(Q(data__is_published=True) & Q(data__is_published__isnull=False) <em># 예상한 결과가 나옵니다.</em>
Book.objects.filter(Q(data__is_published=False) | Q(data__is_published__isnull=True) <em># 예상한 결과가 나오며 가장 추천하는 방법입니다.</em>