2016-11-24 16 views
0

여기서 내가 원하는 것은 두 테이블을 결합하고, 값을 Post 테이블에서과 같이 증가시키고, 현재 사용자, PostId, has_liked = True이있는 UserLikes 테이블에 다른 행을 추가하는 것입니다. 또한 현재 사용자가 이미 현재 게시물을 좋아하는지 여부를 확인 하시겠습니까? 아래는 제 코드입니다.Django에서 두 테이블을 조인하는 쿼리를 작성하는 방법은 무엇입니까?

models.py

class Posts(models.Model): 
    title = models.CharField("Title", max_length=140) 
    url = models.FileField("URL") 
    likes = models.IntegerField("Likes", default=0) 
    by = models.ForeignKey(User) 
    date = models.DateTimeField(auto_now_add=True) 

    def __str__(self): 
     return self.title + ' by ' + str(self.by) 

class UserLikes(models.Model): 
    post = models.ForeignKey(Posts) 
    user = models.ForeignKey(User) 
    has_liked = models.BooleanField("Liked", default=False) 

    def __str__(self): 
     return str(self.post) + ' by ' + str(self.user) 

views.py

def like(request, pk): 
    if request.POST : 
     post = get_object_or_404(Posts, pk=pk) 
     print(request.user) 
     obj = UserLikes.objects.filter(post_id__in=post.id, user=request.user) 
     try: 
      if obj.has_liked is not True: 
       obj.post_id = post.id 
       obj.user = request.user 
       obj.has_liked = True 
       obj.save() 

      post.likes = str(int(post.likes) + 1) 
      post.save() 
     except AttributeError: 
      return HttpResponse(post.likes) 
    else: 
     return HttpResponse(post.likes, {'like': 'disabled'}) 

urls.py

url(r'^(?P<pk>\d+)/like/$', views.like, name='likes'), 

그래서, 무엇을 것 쿼리는 views.py 파일에 있습니까?

답변

0

당신의 Post 모델에 likes 필드는 당신이 그것을 많이 사용해야하는 경우 어쩌면 그것을 Post의 속성을, 대신 쿼리와 함께 좋아하는 수를 얻을, 데이터를 복제한다

@property 
def number_of_likes(self): 
    return self.userlikes_set.count() 

나머지는 사소한 것이되고,이 인스턴스에 대해 사용자 형을 추가하면됩니다.

+0

@ Sayse,하지만 이해할 수없는 것은 각 사용자를 한 번만 좋아하고 'UserLikes' 테이블에 저장하는 방법을 이해하는 것입니다. 또한 인덱스 페이지를 열 때 쿼리를 어떻게 검색 할 것인가? – CapJ

+0

@CapJ 'UserLikes' 모델에서 사용자 당, 게시물 당 하나만 원하면'unique_together = ('post ','user ')'를 설정하십시오 : https://docs.djangoproject.com/en/1.10/ref/models/options/# unique-together –

+0

나를 도왔던 @elkubo에게 감사드립니다. – CapJ

관련 문제