Django在2个不同应用程序之间对ManyToManyField的使用

时间:2019-03-27 10:26:21

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

假设我们有2个应用程序,游戏和彩带。两个应用程序都有自己的视图,模型,模板等。在应用程序流媒体中,我们获得了模型 流光

带有字段

games = models.ManyToManyField('games.Game')

,我们正在从应用程序游戏中导入模型游戏。现在,在迁移之后,添加一些内容,我们可以创建对象Streamer并将其正在玩的游戏分配给他。但是当要显示选定流媒体正在播放的所有游戏时,只需添加到模板标签

{{streamer.games}}

我们正在获取模板字符串

games.Game.None

是某种原因导致的,我们还不知道确切是什么。我们已经为游戏,流媒体,模板,URL创建了视图,并且一切正常,因为我们正在获取流媒体的昵称或流媒体与YouTube / Twitch的链接等数据,但是如果我们希望在我们的应用程序中,流媒体可以显示分配给流媒体的游戏我们应该从彩带和游戏中导入视图和模型吗?还是我们应该在应用流媒体/views.py中更改任何视图,并放置从应用游戏导入的游戏?我知道如何在具有模型和关系ManyToMany的单个应用程序中执行此操作,因为我已经有机会(在StackOverFlow帮助下)执行类似的操作。但是知道我正在做项目(用于学习),因此我决定更好地分离单个应用程序,但我不确定该怎么做。如果两个模型都可以在1个应用中使用并且可以编写视图,那么我可以这样使用

    {% for game in streamer.games.all %}
    {{ games.title }}
    {% endfor %}

但这对我来说是个问题,因为这是两个不同的应用程序(我读到,最好将它们分开,例如具有良好的实用性)

streamers / models.py

from django.db import models
from games.models import Game, Genre
from shots.utils import get_unique_slug
from django.utils import timezone

...

# model for streamer
class Streamer(models.Model):
    nick = models.CharField(max_length=30)
    twitch = models.CharField(max_length=70)
    games = models.ManyToManyField('games.Game')
        ...

streamers / views.py

from django.shortcuts import render, get_object_or_404, redirect
from .models import Streamer
from django.utils import timezone
from django.contrib.auth.decorators import login_required
from .forms import StreamerForm

...

# defining page for single streamer
def streamer_detail(request, slug):
    streamer = get_object_or_404(Streamer, slug=slug)
    return render(request, 'streamers/streamer_detail.html', {'streamer': streamer})
...

streamers / templates / streamer_detail.html

{% block content %}
    <div class="post">
        {% if streamer.published_date %}
            <div class="date">
                {{ streamer.published_date }}
            </div>
        {% endif %}
        {% if user.is_authenticated %}
        <a href="{% url 'streamer_edit' slug=streamer.slug %}">Edit streamer</a>
        {% endif %}
        <h2>{{ streamer.nick }}</h2>
        <a href="https://{{streamer.youtube}}">My YouTube Channel</a>
        <a href="https://{{ streamer.twitch }}">My Twitch Channel</a>
        <p>I'm streaming on {{ streamer.platform }}</p>
        Games that I'm playing
        {{ streamer.games }}
    </div>
{% endblock %}

games / models.py

from django.db import models
from django.utils import timezone
from shots.utils import get_unique_slug

# model for game
class Game(models.Model):
    title = models.CharField(max_length=70)
    genres = models.ManyToManyField('Genre', blank=True)
        ...
# model for genre
...

games / views.py

from django.shortcuts import render, get_object_or_404, redirect
from .models import Game
from django.utils import timezone
from django.contrib.auth.decorators import login_required
from .forms import GameForm

# defining page with newest games
...

# defining page for single games
def game_detail(request, slug):
    game = get_object_or_404(Game, slug=slug)
    return render(request, 'games/game.html', {'game': game})

...

1 个答案:

答案 0 :(得分:0)

好吧,看来我们不必从1个应用程序的视图导入到2nd个应用程序的视图。要访问这些查询集,我们所需要的只是使用正确的循环,在我的情况下,有1个字母太多

游戏 s 。标题

所以当我将其更改为game.title时,一切正常

    {% for game in streamer.games.all %}
    {{ game.title }}
    {% endfor %}