Значение QuerySet для точного поиска должно быть ограничено одним результатом с использованием нарезки - PullRequest
0 голосов
/ 28 декабря 2018

Я пытаюсь сгенерировать набор запросов, используя отношение один ко многим через внешний ключ. Я пытаюсь получить экземпляр профиля от текущего пользователя, вошедшего в систему, а затем получить профиль после, после чего я извлеку сообщение, а такжекомментарий.Связанными моделями являются: -

#models.py
from django.contrib.auth.models import User

#this is how profile of a sample user, say MAX looks like
class Profile(models.Model):
    Follwers=models.IntegerField(default='0')
        user=models.OneToOneField(User,on_delete=models.CASCADE,primary_key=True)
    bio=models.TextField(max_length=120,blank=True)
    location=models.CharField(max_length=30,blank=True)
    birth_date=models.DateField(null=True,blank=True)
    verified=models.BooleanField(default=False)
        ProfilePic=models.ImageField(upload_to='UserAvatar',blank=True,null=True)

def __str__(self):
    return self.user.username

@receiver(post_save,sender=User)
def update_user_profile(sender,instance,created,**kwargs):
    if created:
        Profile.objects.create(user=instance)
    instance.profile.save() 

class FollowingProfiles(models.Model):
    Profile=models.ForeignKey(Profile,on_delete=models.CASCADE)
    ProfileName=models.CharField(max_length=120,blank=True,null=True)

    def __str__(self):
        return self.ProfileName

class post(models.Model):
    Profile=models.ForeignKey(Profile,on_delete=models.CASCADE)
    Picture=models.ImageField(upload_to='PostMedia',blank=True,null=True)
    DatePosted=models.DateTimeField(default=timezone.now)
    Content=models.TextField(blank=True,null=True)

    def __str__(self):
        return self.Profile.user.username

class comment(models.Model):
    post=models.ForeignKey(post,on_delete=models.CASCADE)
    Profile=models.ForeignKey(Profile,on_delete=models.CASCADE)
 Content=models.CharField(max_length=120,null=False,blank=False,default='it is sapora')

    def __str__(self):
        return self.Profile.user.username

#views.py
def feed(request):
    if request.user.is_authenticated:
        profile=Profile.objects.filter(user=request.user)
        userfollowing=FollowingProfiles.objects.filter(Profile=profile)
        for following in userfollowing:
            username=following.ProfileName
            useraccount=User.objects.filter(username=username)
            mprofile=Profile.objects.filter(user=useraccount)
            Post=post.objects.filter(Profile=mprofile)
            comment=comment.objects.filter(post=Post)
            final_post_queryset=final_post_queryset+Post
            final_comment_queryset=final_comment_queryset+comment
        return render(request,'feed/feed.html',{'final_comment_queryset':final_comment_queryset,'final_post_queryset':final_post_queryset})
    else:
        return redirect('signup')

. Выдает следующую ошибку: - Значение QuerySet для точного поиска должно быть ограничено одним результатом с использованием срезов.

Ответы [ 2 ]

0 голосов
/ 17 июня 2019
profile=Profile.objects.filter(user=request.user)[0]
userfollowing=FollowingProfiles.objects.filter(Profile=profile)

profile должен быть Profile-object, а не Profile-queryset.

0 голосов
/ 28 декабря 2018

Есть много проблем с кодом, который вы предоставили здесь.

Первый:

if request.user.is_authenticated:
    profile=Profile.objects.filter(user=request.user)  <--- Here

Профиль имеет отношение OneToOne к пользователю.Так что он должен быть доступен через request.user.profile.

Также в последующих частях вы смешиваете набор запросов с Django Object и пытаетесь создать их, что не имеет смысла.Если вы хотите видеть комментарии и посты, вы можете просто сделать так, чтобы это был шаблон, подобный этому:

{% if user.is_authenitcated %}
    {% for post in user.profile.post_set.all %}
          {{ post }}
          {% for comment in post.comment_set.all %}
              {{ comment }}
          {% endfor %}
    {% endfor %}
{% endif %}

И этот код будет работать в любом шаблоне вашего проекта.Для справки см. Документацию для связанных объектов.

Обновление

Вы можете использовать ManyToMany , чтобы установить following в профиле:

class Profile(models.Models):
    # rest of the code
    following = models.ManyToManyField("self", blank=True)

А в шаблоне покажи свои посты вот так:

{% if user.is_authenitcated %}
    {% for profile in user.profile.following.all %}
          {% for post in profile.post_set.all %}
              {{ post }}
          {% endfor %}
    {% endfor %}
{% endif %}
...