Django manytomany 字段持有用户自动填充

问题描述

我正在从网络上的 json 文件提取数据,并在我的 django 数据库中更新它。我想跟踪与每个团队关联的用户,但是一旦用户将其添加到模型中后加载页面。我如何避免这种情况?

class Team(models.Model):
    name = models.CharField(max_length=120)
    abbreviation = models.CharField(max_length=3)
    id = models.IntegerField(primary_key=True)
    link = models.CharField(max_length=120)
    wins = models.IntegerField(default=0)
    losses = models.IntegerField(default=0)
    ties = models.IntegerField(default=0)
    points = models.IntegerField(default=0)
    users = models.ManyToManyField(User)
def getTeams():
    import requests
    baseUrl = "https://statsapi.web.nhl.com/"

    # INITALIZING THE DATA IN THE DATA DICTIONARY
    r = requests.get(baseUrl + '/api/v1/teams')
    originalData = r.json()
    # i dont need the copyright,only care about the teams
    originalData = originalData["teams"]
    for team in originalData:
        id = team["id"]
        try:
            databaseTeam = Team.objects.get(id = id)
        except Exception:
            Team.objects.create(id = id)
            databaseTeam = Team.objects.get(id = id)
        databaseTeam.name = team["name"]
        databaseTeam.abbreviation = team["abbreviation"]
        databaseTeam.link = team["link"]
        databaseTeam.save()
    print("done")

@login_required
def myTeamView(request):
    t1 = Thread(target=getTeams)
    t1.start()
    return(render(request,"teams/myTeams.html",{}))

解决方法

用户存储在请求中的 user 变量中,因此首先我们需要将其传递给 getTeams 方法。然后我们使用 Manytomany 字段的方法 add 向其附加一条记录,在本例中为用户。

def getTeams(request):
    import requests
    baseUrl = "https://statsapi.web.nhl.com/"

    # INITALIZING THE DATA IN THE DATA DICTIONARY
    r = requests.get(baseUrl + '/api/v1/teams')
    originalData = r.json()
    # i dont need the copyright,only care about the teams
    originalData = originalData["teams"]
    for team in originalData:
        id = team["id"]
        try:
            databaseTeam = Team.objects.get(id = id)
        except Exception:
            Team.objects.create(id = id)
            databaseTeam = Team.objects.get(id = id)
        databaseTeam.name = team["name"]
        databaseTeam.abbreviation = team["abbreviation"]
        databaseTeam.link = team["link"]
        databaseTeam.save()
        databaseTeam.users.add(request.user) # after save!!
    print("done")

@login_required
def myTeamView(request):
    t1 = Thread(target=getTeams,args=(request,))
    t1.start()
    return(render(request,"teams/myTeams.html",{}))