如何从多对多字段中获取所有数据?

时间:2019-01-06 10:58:36

标签: python django

我在这里要做的是向他关注的所有用户显示当前用户“ 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 }} ,  &nbsp;
         <b class="sell">sell</b>: {{i.sell}},  &nbsp;


        {% endfor %}

我在“ all.html”中得到的结果是,它在多个字段中显示了他正在关注的第一个用户的所有信号。但他关注的其他用户却一无所获。我希望当前用户可以看到他关注的所有用户的所有招牌。

1 个答案:

答案 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]在其中添加多对多关系以供关注。