snu-sf-class / swpp201901

소프트웨어 개발의 원리와 실습
27 stars 8 forks source link

HW1 질문 #20

Open hashnut opened 5 years ago

hashnut commented 5 years ago

과제를 하다가 해결이 힘든 에러가 있어 질문 드립니다..

  1. POST 기능을 이용해서 meeting 항목을 추가하고 있었는데요, models.py 에
        sinceWhen = models.DateTimeField()
        tilWhen = models.DateTimeField()

    DateTimeField() 괄호를 비워두고

http -a test1:password1 POST http://127.0.0.1:8000/meetings/ sinceWhen="2019-03-01 00:00:00.000000" tilWhen="2018-03-02 00:00:00.000000" 이런식으로 추가하려하니

  File "/home/tony/env/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py", line 298, in execute
    return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: NOT NULL constraint failed: meetings_meeting.sinceWhen

에러가 뜨는데 도저히 원인이 뭔지 모르겠습니다..이전엔 잘 작동했었던 것 같은데요..

  1. 시간이 겹치는 문제를 해결할 때 https://www.django-rest-framework.org/api-guide/serializers/#object-level-validation 이 문서를 참고하면 validate 함수를 MeetingSerializer class에 넣기만 하면 작동이 되어야 하는 건가요?
sunghwanl commented 5 years ago
  1. 적어주신 정보만으로는 원인을 알기가 어렵습니다. 전에 에러의 trace를 보여주실 수 있나요?
  2. 올바르게 작성하였다면 그렇습니다.
petrosyh commented 5 years ago
  1. validate함수에 시간이 겹치는 경우를 처리하도록 하면 잘 작동할 수 있을 것입니다.
hashnut commented 5 years ago

전체 에러는 이렇습니다. @Sung-HwanLee

System check identified no issues (0 silenced).
March 24, 2019 - 08:49:59
Django version 2.1.7, using settings 'swpp_hw1.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Internal Server Error: /meetings/
Traceback (most recent call last):
  File "/home/tony/env/lib/python3.6/site-packages/django/db/backends/utils.py", line 85, in _execute
    return self.cursor.execute(sql, params)
  File "/home/tony/env/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py", line 298, in execute
    return Database.Cursor.execute(self, query, params)
sqlite3.IntegrityError: NOT NULL constraint failed: meetings_meeting.sinceWhen

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/tony/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/home/tony/env/lib/python3.6/site-packages/django/core/handlers/base.py", line 126, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/tony/env/lib/python3.6/site-packages/django/core/handlers/base.py", line 124, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/tony/env/lib/python3.6/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/home/tony/env/lib/python3.6/site-packages/django/views/generic/base.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/tony/env/lib/python3.6/site-packages/rest_framework/views.py", line 495, in dispatch
    response = self.handle_exception(exc)
  File "/home/tony/env/lib/python3.6/site-packages/rest_framework/views.py", line 455, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/home/tony/env/lib/python3.6/site-packages/rest_framework/views.py", line 492, in dispatch
    response = handler(request, *args, **kwargs)
  File "/home/tony/env/lib/python3.6/site-packages/rest_framework/generics.py", line 244, in post
    return self.create(request, *args, **kwargs)
  File "/home/tony/env/lib/python3.6/site-packages/rest_framework/mixins.py", line 21, in create
    self.perform_create(serializer)
  File "/home/tony/swpp_hw1/meetings/views.py", line 18, in perform_create
    serializer.save(owner=self.request.user)
  File "/home/tony/env/lib/python3.6/site-packages/rest_framework/serializers.py", line 214, in save
    self.instance = self.create(validated_data)
  File "/home/tony/swpp_hw1/meetings/serializers.py", line 50, in create
    return Meeting.objects.create(**validated_data)
  File "/home/tony/env/lib/python3.6/site-packages/django/db/models/manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/tony/env/lib/python3.6/site-packages/django/db/models/query.py", line 413, in create
    obj.save(force_insert=True, using=self.db)
  File "/home/tony/swpp_hw1/meetings/models.py", line 26, in save
    super(Meeting, self).save(*args, **kwargs)
  File "/home/tony/env/lib/python3.6/site-packages/django/db/models/base.py", line 718, in save
    force_update=force_update, update_fields=update_fields)
  File "/home/tony/env/lib/python3.6/site-packages/django/db/models/base.py", line 748, in save_base
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
  File "/home/tony/env/lib/python3.6/site-packages/django/db/models/base.py", line 831, in _save_table
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
  File "/home/tony/env/lib/python3.6/site-packages/django/db/models/base.py", line 869, in _do_insert
    using=using, raw=raw)
  File "/home/tony/env/lib/python3.6/site-packages/django/db/models/manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/tony/env/lib/python3.6/site-packages/django/db/models/query.py", line 1136, in _insert
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/home/tony/env/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 1289, in execute_sql
    cursor.execute(sql, params)
  File "/home/tony/env/lib/python3.6/site-packages/django/db/backends/utils.py", line 100, in execute
    return super().execute(sql, params)
  File "/home/tony/env/lib/python3.6/site-packages/django/db/backends/utils.py", line 68, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "/home/tony/env/lib/python3.6/site-packages/django/db/backends/utils.py", line 77, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/home/tony/env/lib/python3.6/site-packages/django/db/backends/utils.py", line 85, in _execute
    return self.cursor.execute(sql, params)
  File "/home/tony/env/lib/python3.6/site-packages/django/db/utils.py", line 89, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/home/tony/env/lib/python3.6/site-packages/django/db/backends/utils.py", line 85, in _execute
    return self.cursor.execute(sql, params)
  File "/home/tony/env/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py", line 298, in execute
    return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: NOT NULL constraint failed: meetings_meeting.sinceWhen
[24/Mar/2019 08:50:03] "POST /meetings/ HTTP/1.1" 500 20410

DateTimeField(auto_now = True)이런식으로 하면 현재 시간으로 추가가 되고 에러가 뜨지는 않습니다.

sunghwanl commented 5 years ago

혹시 브라우저로 post를 시도할 경우에도 에러가 발생하나요?

hashnut commented 5 years ago

네. DateTimeField 대신 textfield를 쓰면 괜찮습니다만.. DateTimeField 를 쓰면 NOT NULL constraint failed: meetings_meeting.sinceWhen

에러가 뜨네요... DateTimeField 대신 쓸 수 있는 게 있을까요? DateTime 이나.. 괄호 안에 아무것도 넣지 않으면 작동을 하지 않는 것이 정상인가요??

스크린샷, 2019-03-24 18-18-09

일단 코드를 swpp@sf.snu.ac.kr로 보내보겠습니다.

sunghwanl commented 5 years ago

메일로 답변 드렸습니다.