인프런 커뮤니티 질문&답변
장고 models 설계, 데이터 입력 질문
작성
·
183
0
안녕하세요. 장고를 활용하여 웹사이트를 만들고 있는 중입니다.
제가 지금 구현 중인 부분은 식단표 페이지로, 모델 단과 데이터 입력 단에서 막혀서 질문을 드립니다.
우선, "menu_list.html" 화면을 아래와 같이 띄우려고 합니다. 이를 위해 모델 구현부터 질문드리겠습니다.
-20.jpg)
첫번째 질문은 모델 구현에 대한 부분입니다. 최초 모델보다 수정 모델이 더 바람직한 방향인지 궁금합니다.
#최초 model
class Menu(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='author_menu')
date = models.DateField(unique=True)
breakfast = models.TextField()
lunch = models.TextField()
dinner = models.TextField()
voter = models.ManyToManyField(User, related_name='voter_menu')
def __str__(self):
return self.breakfast#수정 model
TYPE_CHOICES = (
("아침", "아침"),
("브런치", "브런치"),
("점심", "점심"),
("저녁", "저녁"),
)
class Dish(models.Model):
dish = models.CharField(max_length=10)
voter = models.ManyToManyField(User)
def __str__(self):
return self.dish
class Menu(models.Model):
type = models.CharField(choices=TYPE_CHOICES, max_length=3)
date = models.DateField()
dish = models.ManyToManyField(Dish)
최초 모델은 아무런 고민 없이 TextField로 식사 정보를 모두 받아왔으나 성능 측면에서 비효율적일 수 있다는 생각이 들어 고민을 하고 수정하였습니다. 수정된 설계가 더 바람직한 것인지 의문이 들어 질문드립니다. 더 바람직한 방향이 있다면 가르쳐주세요!!
두번째 질문은, 수정된 model을 통해 값을 받아오는 것이 어려워서 질문드립니다.
#forms.py
TYPE_CHOICES = (
("아침", "아침"),
("브런치", "브런치"),
("점심", "점심"),
("저녁", "저녁"),
)
class DishMenuForm(forms.Form):
date = forms.DateField(widget=forms.DateInput(attrs={'type': 'date'}, format="%Y-%M-%d"),label='date')
type = forms.ChoiceField(choices=TYPE_CHOICES, label='type')
dish = forms.CharField(label='dish', max_length=10)
def save(self, commit=True):
menu = Menu(**self.cleaned_data)
if commit:
menu.save()
return menu#menu_form.html
{% extends 'layout.html' %}
{% load static %}
{% block content %}
<script src ="{% static 'js/menu.js' %}"></script>
<div class="container">
<h5 class="my-3 border-bottom pb-2">메뉴 입력하기</h5>
<form method="post">
{% csrf_token %}
<div id ="dishMenuForm">
<div class="mb-3">
<label for="date" class="form-label">날짜</label>
<input type="date" class="form-control" name="date" id="date" width='50px'>
</div>
<div class="mb-3">
<label for="breakfast" class="form-label">아침</label>
<select name='type' id ='type' class='form-control'>
<option value="">시간대를 정해주세요.</option>
<option value='아침'>아침</option>
<option value='점심'>점심</option>
<option value='저녁'>저녁</option>
<option value='브런치'>브런치</option>
</select>
</div>
<div class="mb-3">
<label for="dish" class="form-label">요리</label>
<textarea class="form-control" name="dish[]"
id="dish" rows="1"></textarea>
</div>
<div class="mb-3">
<label for="dish" class="form-label">요리</label>
<textarea class="form-control" name="dish[]"
id="dish" rows="1"></textarea>
</div>
<div class="mb-3">
<label for="dish" class="form-label">요리</label>
<textarea class="form-control" name="dish[]"
id="dish" rows="1"></textarea>
</div>
</div>
<input type='submit' value='입력' />
</form>
</div>
{% endblock %}
사진처럼 form.html 화면에서 dish의 form들을 동적으로 추가하여 저장하고 싶습니다.
템플릿 파일에서 dish의 name을 배열로 받아와 view 단에서 반복문을 사용하여 데이터를 저장할 수 있는지 궁금합니다. 성능을 위해 매번 데이터를 저장할때마다 dish 테이블에 이미 값이 있는지를 확인하고 저장해야하는 것인지, 데이터를 저장할때마다 분기를 돈다면 성능에 더 악영향을 미칠 것 같은데 어떤 방향으로 개발해야 하는지 궁금합니다. 이런 식의 방향이 맞는지 아니면 더 잘 쓰이는 방법이 있는지 알려주세요..
질문이 길고 장황하지만 답변 부탁드립니다.
답변
답변을 기다리고 있는 질문이에요
첫번째 답변을 남겨보세요!




