2017-12-10 8 views
0

와 필터링 된 외래 키를 검색합니다내가 세 가지 주요 모델, 사진, 장소 ​​및 PlaceRating이 장고

class Picture(models.Model): 
    file = ImageField(max_length=500, upload_to="images") 
    user = models.ForeignKey(User, null=True, related_name="userpictures") 
    place = models.ForeignKey(Place, null=True, related_name='pictures') 

class PlaceRating(models.Model): 
    place = models.ForeignKey(Place, null=True, related_name="placeratings") 
    user = models.ForeignKey(User, null=True, related_name="userratings") 
    rating = models.DecimalField(null=True, max_digits=4, decimal_places=1)  

class Place(models.Model): 
    name = CharField(max_length=50) 

내가 함께 장소의 이미지, 사용자에 의해 주어진 장소의 등급을 표시하고 싶지만, 그럴 수 없어 내가 ForeignKey를 필터링해야하고 Django가 그것을 허용하지 않는 것처럼 그렇게 할 수 있습니다.

내가하고 싶은 것이 예 :

보기 :

pictures = Picture.objects.filter(user=request.user) 

템플릿 :

{% for picture in pictures %} 
    <img src="{{ picture.file.url }}" class="bigpicture"> 
    {{ picture.place.placeratings.0.rating|user:picture.user }} 
{% endfor %} 
내용

, 나는, templatetags 함께 할 관리하지만, 이것은 내가 가져올 수없는 많은 다른 쿼리를 데이터베이스에 생성합니다. :

{% for picture in pictures %} 
    <img src="{{ picture.file.url }}"> 
    {% getplaceratingrelatedtopic picture.place.id picture.user.id %} 
{% endfor %} 

그리고 :

내가 파이썬 2.7/장고 1.9와 함께 작동
@register.simple_tag 
def getplaceratingrelatedtopic(placeid, userid): 
    print(placeid) 
    theplace = Place.objects.get(id=placeid) 
    user = User.objects.get(id=userid) 
    placerating = PlaceRating.objects.filter(author=user, place=place).last() 
    if rating: 
     return placerating.rating 
    else: 
     return "" 

.

단서가 있습니까? 고마워요!

답변

0

로직을 모델로 이동하여 템플릿에서 사용해야합니다.

class Picture(models.Model): 
    file = ImageField(max_length=500, upload_to="images") 
    user = models.ForeignKey(User, null=True, related_name="userpictures") 
    place = models.ForeignKey(Place, null=True, related_name='pictures') 


class PlaceRating(models.Model): 
    place = models.ForeignKey(Place, null=True, related_name="placeratings") 
    user = models.ForeignKey(User, null=True, related_name="userratings") 
    rating = models.DecimalField(null=True, max_digits=4, decimal_places=1)  


class Place(models.Model): 
    name = CharField(max_length=50) 

    @property 
    def rating(self): 
     return self.placeratings.get().rating 

{% for picture in picture_list %} 
    <img src="{{ picture.file.url }}" class="bigpicture"> 
    {{ picture.place.rating }}: {{ picture.user.username }} 
{% endfor %} 
+0

솔루션을 제공해 주셔서 감사합니다. 그러나 이것은 사용자가 게시 한 평점에만 등급을 필터링하지 않습니다. 나는 다음과 같은 것을 필요로 할 것이다. @property def rating (self) : return self.placeratings.filter (user = request.user) [0] .rating 장고가 받아들이지 않는. –