【问题标题】:Django - Many to Many Model Returning NoneDjango - 多对多模型返回无
【发布时间】:2017-03-05 16:26:51
【问题描述】:

长期聆听者,第一次海报。希望在我的模型问题上得到一些帮助。

我的多对多关系有问题。当我提交表单时,我想让我的用户信息与他们创建的帖子相关联。我正在使用多对多,因为我将有一个额外的功能,其他用户可以参加同一次旅行。

目前,我的 Trip 表数据创建良好,但我的用户未链接到 Trip id,因此我无法在模板上呈现他们的姓名。

下面是我的代码。感谢任何帮助! 干杯

这是我的models.py:

class User(models.Model):
    name = models.CharField(max_length=45)
    username = models.CharField(max_length=255)
    password = models.CharField(max_length=255)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    objects = UserManager()

class Trip(models.Model):
    destination = models.CharField(max_length=45)
    description = models.CharField(max_length=255)
    datefrom = models.CharField(max_length=255)
    dateend = models.CharField(max_length=255)
    user = models.ManyToManyField(User)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

这是我的views.py:

def travels(request):
    user = User.objects.get(id=request.session['logged_user'])
    all_trips = Trip.objects.all().order_by('-id')
    user_trips = Trip.objects.filter(user=request.session['logged_user'])
    context = {
        "user_trips": user_trips,
        "all_trips": all_trips,
        "user": user,
    }
    return render(request, 'belt_exam/travels.html', context)

def addtrip(request):
    user_id = request.session['logged_user']
    createdtrip = Trip.objects.create(destination=request.POST['destination'], description=request.POST['description'], datefrom=request.POST['datefrom'], dateend=request.POST['dateend'])
    createdtrip.user.add(User.objects.get(id=user_id))    
    return redirect('/travels')

这是我的模板:

{% for alltrip in all_trips.all %}
    <tr>
        <td>{{alltrip.name}}</td>
        <td><a href="travels/destination/{{alltrip.id}}">{{alltrip.destination}}</a></td>
        <td>{{alltrip.datefrom}}</td>
        <td>{{alltrip.dateend}}</td>
        <td>
        <form class="" action="travels/destination/{{alltrip.id}}" method="POST">
        {% csrf_token %}
        <input type="submit" value="Join">
        </form>
        </td>
    </tr>
{% endfor %}

【问题讨论】:

    标签: python django django-models many-to-many


    【解决方案1】:

    排队

    user_trips = Trip.objects.filter(user=request.session['logged_user'])
    

    您正在将会话中的用户 ID 与 User 对象进行比较。这是行不通的。正确的是

    user_trips = Trip.objects.filter(user=user)
    

    但是有一种更好的方法可以让用户出行。 Django 为每个关系创建一个反向关系。名称可以设置为ManyToManyFieldrelated名称属性

    user = models.ManyToManyField(User, related_name='trips')
    

    现在您可以在目标模型上将该属性用作对象管理器(如 objects

    user_trips = user.trips.all()
    

    【讨论】:

    • 谢谢克劳斯!不过,我仍然对它的工作原理感到有些困惑。我的“models.ManyToManyField(User)”位于 Trip 表上。我正在尝试将这两个表链接在一起,以便将发布者的用户 ID 添加到旅行 ID。你能帮忙解释一下吗?抱歉,我是编程新手,所以感谢您的耐心等待!
    猜你喜欢
    • 2018-12-29
    • 2014-01-03
    • 2016-05-06
    • 2016-07-17
    • 2019-09-15
    • 2023-04-06
    • 1970-01-01
    • 2011-12-20
    • 2018-01-13
    相关资源
    最近更新 更多