죄송합니다. 귀하의 코드로 판단 해 보니 장고를 처음 사용하는 사람이라고 가정합니다. 따라서이 답변은 프로세스 대답 질문뿐만 아니라 유익한 정보가 될 것입니다. 리뷰 모델에서
사용자, user
대신 CharField
의 ForeignKey
해야한다. 나는 네임드를 저장하는 것이 더 자연 스럽다는 것을 이해한다. 특히 데이터베이스 테이블을 직접 보게된다면, 그 접근법은 오류가 발생하기 쉽고, 아주 좋은 이유가 없다면, 나쁜 일을해야한다.
사용자 이름이 foousername
인 경우를 상상해보십시오. 그런 다음 해당 사용자가 몇 개의 리뷰를 만듭니다. 따라서이 시점에서 user
필드가 foousername
이되는 몇 가지 리뷰를 갖게됩니다. 이제 사용자가 자신의 사용자 이름을 someotherfoousername
으로 변경하려는 경우 리뷰와 사용자 간의 연결을 끊지 않으려면 사용자가 새 사용자 이름을 사용하기 위해 만든 모든 리뷰에 대해 user
필드를 변경해야합니다. 이것은 잊어 버릴 수있는 추가 단계이므로 오류가 발생하기 쉽습니다. ForeignKey
을 사용하면이 문제가 즉시 해결됩니다. 사용자가 사용자 이름을 변경하더라도 사용자의 기본 ID는 변경되지 않으므로 리뷰가 기본 키 (외래 키가 무엇인지)에 연결되면 리뷰를 업데이트 할 필요가 없습니다. 따라서 작업량이 적고 안정적인 방법입니다.
그래서 (다음 related_name
를 설명합니다)이 작업을 수행 :
user = models.ForeignKey(User, related_name='reviews')
related_name
당신이 related_name
를 사용하고, 장고는 당신의 인생을 만들어 더 쉽게.
보기. 먼저 제품을 조회합니다. 그런 다음 얻은 정보를 ID로 가져온 다음 해당 제품의 모든 리뷰를 반환하는 쿼리를 작성합니다. Django를 사용하면 훨씬 적은 코드를 사용하여 모든 작업을 수행 할 수 있습니다.
product = get_object_or_404(Productbackup, url_friendly=product_name)
reviews = product.reviewbackup_set.all()
그러나 이것은 전체 _set
사업 때문에 다소 혼란 스럽습니다. related name
가 들어오는 곳이다 다음과 같이 당신이 당신의 product
필드를 정의 경우.
product = models.ForeignKey(Productbackup, related_name='reviews')
는 다음 조금 더 읽을 수있는 방법을 같은 작업을 수행 할 수 있습니다 (파이썬 읽을 수 있어야 ...) :
reviews = product.reviews.all()
사용자 프로필
외래 키는 일대 다 관계를 구현할 수 있습니다. 그래서 제품과 리뷰를 위해 그것은 완벽하게 이해됩니다. 하나의 제품은 많은 리뷰를 가질 수 있습니다. 그러나 일반적으로 이는 사용자 프로필에 해당하지 않습니다. 일반적으로 사용자에게는 하나의 사용자 프로필 만 있습니다. 따라서 사용자 프로필에서, 당신과 같이 OneToOneField
를 사용해야하는 대신 사용자에게 ForeignKey
을 가지고 있지만 안 :
user = models.OneToOneField(User, primary_key=True, related_name='profile')
를 쉽게 사용자의 프로필에 액세스 할 수 있도록 그 :
user_profile = User.objects.get(...).profile
사용자의 이미지를
첫 번째 설명에 따라 사용자가 ForeignKey
이므로 검토 할 때마다 매우 쉽게 사용자의 이미지에 액세스 할 수 있습니다.
프로젝트 설정에서
MEDIA_ROOT
에 정의 된 한 -
이미지 URL
당신이 장고에 FileField
을 사용할 때마다, 그것은 미디어 폴더 아래 upload_to
위치에 파일을 업로드합니다. 따라서 귀하의 경우 장고는 미디어 폴더 내에 images
폴더에 이미지를 저장합니다. 템플릿에서 직접 URL을 포함하는
user_profile.image.url
하드 코딩 된 URL
그
아주 나쁜 생각 : 당신이
MEDIA_URL
를 구성하는 경우뿐만 아니라, 그와 같은 파일의 URL에 액세스 할 수 있습니다. Thats 패턴 이름은 무엇을위한 것입니다. 그래서 아이디어는 url 패턴에 이름을 지정하는 것이므로 나중에 이름을 참조하여 URL을 얻을 수 있습니다. 따라서 코드를 훨씬 더 유지 보수 할 수 있습니다.이 허용
url(r'^user/(?P<username>\w+)/$', 'user_view', name='user_view')
당신이 템플릿에서과 같이 사용하기 :
{% load url from future %}
link: <a href="{% url 'user_view' username=user.username %}">{{ user.username }}</a>
함께
# views.py
def view_reviews(request, product_name):
product = get_object_or_404(Productbackup, url_friendly=product_name)
reviews = product.reviews.all().order_by("-created_on")
return render_to_response('reserve/templates/view_reviews.html',
{'reviews':reviews},
context_instance=RequestContext(request))
과 최선을 다하는 예를 들어, 다음은 사용자의 URL 패턴입니다
# models.py
class Reviewbackup(models.Model):
review = models.CharField('Review', max_length = 2000)
user = models.ForeignKey(User, related_name='reviews')
rating = models.IntegerField(max_length=2, choices=RATING_OPTIONS)
product = models.ForeignKey(Productbackup, related_name='reviews')
def __unicode__(self):
return self.review
class UserProfile(models.Model):
user = models.OneToOneField(User, primary_key=True, related_name='profile')
image = models.ImageField(blank=True, null=True, max_length=255, upload_to="images/")
d
{# template #}
{% load url from future %}
{% for review in reviews %}
<br><a href="{% url user_view username=review.user.username %}">
{{ review.user.username }}</a><br>
<img class="thumbnail" src="{{ review.user.profile.image.url }}"><br>
{{ review.review }}
{% endfor %}
종합적인 답변 주셔서 감사합니다! 사용자를 CharField에서 ForeignKey로 변경하면 마이그레이션을 실행할 때 오류가 발생합니다. 다음 SQL 쿼리가 실패했습니다. CREATE INDEX "reserve_reviewbackup_fbfc09f1"ON "reserve_reviewbackup"("user_id"); 오류 : index reserve_reviewbackup_fbfc09f1 이미 존재합니다 ! 실제 마이그레이션 실행 중 오류가 발생했습니다! 중단. ! 실행을 지원하지 않는 데이터베이스가 있으므로! 트랜잭션에서 스키마 변경 구문을 사용하면 ! 마이그레이션 사이의 임시 상태로 남겨 둡니다. – sharataka
죄송합니다. 그것을 고치는 방법을 모른다. DB에 얼마나 많은 데이터가 있습니까? db/deployment를 개발한다면 처음부터 syncdb를 시작하여 새로운 db 스키마가 제대로 작동하는지 확인한 다음 모든 디버깅 및 버그 수정 후 이전 데이터를 마이그레이션하십시오. – miki725