我在这里要做的是向他关注的所有用户显示当前用户“ Signels”。但无法获取一个以上用户的数据。
models.py
class Signels(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
coin_name = models.CharField(max_length=300 , null=True, blank=True)
symbol = models.CharField(max_length=10 , null=True, blank=True)
title = models.CharField(max_length = 100, null=True, blank=True)
buy = models.CharField(max_length=200 , null=True, blank=True)
sell = models.CharField(max_length=200 , null=True, blank=True)
class Follow(models.Model):
user = models.ForeignKey(User, related_name='current_user', null=True)
Following = models.ManyToManyField(User)
views.py
def post(request):
user1 = request.user
user_now = Follow.objects.get(user=user1)
for followed in user_now.Following.all():
signel = Signels.objects.filter(author=followed)
return render(request, 'posts/all.html', { "signels" : signel } )
all.html
{% for i in signels %}
<div class="card post_card ">
<a type="button" href="/profile/{{i.author.username}}"
class="username"><b>{{i.author.username}}</b></a>
<p class="category">{{i.title}} </p>
<p class="category"><b>{{i.coin_name}}({{i.symbol}})</b></p>
<b class="buy">buy</b>:{{ i.buy }} ,
<b class="sell">sell</b>: {{i.sell}},
{% endfor %}
我在“ all.html”中得到的结果是,它在多个字段中显示了他正在关注的第一个用户的所有信号。但他关注的其他用户却一无所获。我希望当前用户可以看到他关注的所有用户的所有招牌。
答案 0 :(得分:2)
您可以获得Signels
中的所有author
,并在给定用户之后跟随:
Signels.objects.filter(author__follow__user=request.user)
所以在视图中,我们可以这样写:
def post(request):
signels = Signels.objects.filter(author__follow__user=request.user)
return render(request, 'posts/all.html', { "signels" : signels } )
但是我不确定您当前的建模是否正确。将两个用户链接到Follow
模型可能更好,因此让Follow
充当两个用户之间的“直通”模型。现在,Follow
对象基本上是User
模型之上的一个额外“代理”,因此创建了一个额外的表。在进行建模时,可能会发生User
具有两个(或更多)Follow
对象的情况,每个对象都包含一组following
。这也将导致额外的JOIN
,从而使查询的评估变得“更难”。
也许更有效的“跟进”系统是:
from django.contrib.auth import get_user_model
class Follow(models.Model):
follower = models.ForeignKey(
get_user_model(),
related_name='current_user',
on_delete=models.CASCADE,
related_name='followees'
)
followee = models.ForeignKey(
get_user_model(),
related_name='current_user',
on_delete=models.CASCADE,
related_name='followers'
)
class Meta:
unique_together=('followers', 'followee')
在这种情况下,查询为:
Signels.objects.filter(author__followers__follower=request.user)
在这里,用户不能再跟随同一用户两次,因此我们防止通过多对多关系创建额外的“隐藏”表。
或者您可以create a custom user model [Django-doc]在其中添加多对多关系以供关注。