首页 > 解决方案 > 创建带有外键的对象

问题描述

每当我尝试在下面的代码中运行“add_rat”时,我都会收到错误消息

    Exception Value:    
Cannot assign "441": "Myrating.movieId" must be a "Movie" instance.

我尝试在给出错误的函数定义 bu 中将其作为 movieId_id=movieId 传递:

FOREIGN KEY constraint failed

我也尝试将它作为 int() 值传递,但它不起作用。

我想创建具有 2 个外键的 Myrating 对象。

管理员.py:

from django.contrib import admin
from .models import Movie,Myrating
from django.contrib.auth.models import User
import csv


# Register your models here.
def add_set(modeladmin, request,queryset):
    with open('./movies.csv','r',encoding='utf-8', errors='ignore') as _filehandler:
        csv_file_reader=csv.DictReader(_filehandler)
        for row in csv_file_reader:
            movie=Movie.objects.create_movie(row['movieId'],row['title'],row['genres'],"mov.jpg")
add_set.short_description = "New_Day"
def add_rat(modeladmin, request,queryset):
    with open('./ratings.csv','r',encoding='utf-8', errors='ignore') as _filehandler:
        csv_file_reader=csv.DictReader(_filehandler)
        for row in csv_file_reader:
            movie=Myrating.objects.create_movie(int(row['userId']),Movie.objects.get(movieId=row['movieId']),float(row['rating']))
add_rat.short_description = "New_rat"
def add_user(modeladmin,request,queryset):
    i=1
    while i<=7045:
        user = User.objects.create_user(i, '', 'password')
        user.save()
        i+=1
add_user.short_description = "New_use"
class movie_admin(admin.ModelAdmin):
    list_display=('title','genre')
    list_filter=('genre','title')
    actions=[add_set,add_user,add_rat]
admin.site.register(Movie,movie_admin)
admin.site.register(Myrating)

模型.py:

from django.contrib.auth.models import Permission, User
from django.core.validators import MaxValueValidator, MinValueValidator
from django.db import models
class movie_manager(models.Manager):
    def create_movie(self, movieId,title,genre,movie_logo):
        movie = self.create(movieId=movieId,title=title,genre=genre,movie_logo=movie_logo)
        # do something with the book
        return movie
class Movie(models.Model):
    movieId=models.PositiveIntegerField()
    title       = models.CharField(max_length=200)
    genre       = models.CharField(max_length=100)
    movie_logo  = models.FileField()
    objects=movie_manager()
    def __str__(self):
        return str(self.title)
class rating_manager(models.Manager):
    def create_movie(self, user,movieId,rating):
        movie = self.create(user_id=user,movieId=movieId.id,rating=rating)
        # do something with the book

        return movie
class Myrating(models.Model):

    user    = models.ForeignKey(User,on_delete=models.CASCADE)
    movieId= models.ForeignKey(Movie,on_delete=models.CASCADE)
    rating  = models.IntegerField(default=1,validators=[MaxValueValidator(5),MinValueValidator(0)])
    objects=rating_manager()

标签: djangosqlitedjango-modelsdjango-admin

解决方案


您有movieID,它引用了电影模型,为此,当您保存时,您需要提供应该是电影实例的值。

movie = self.create(user_id=user,movieId=movieId.id,rating=rating)

这里的 movieID 是 Movie 实例,但您分配的是一个 int 的 movieID.id。这就是它抛出错误的原因。

Cannot assign "441": "Myrating.movieId" must be a "Movie" instance.

以下是解决方案。

movie = self.create(user_id=user,movieId=movieId,rating=rating)

或者

movie = self.create(user_id=user,movieId_id=movieId.id,rating=rating)

您可以将 Myrating movieId字段重命名为movie,因为电影名称是有意义的,因为它与 Movie 实例相关。

您可以关注官方文档链接以获取更多详细信息和示例。


推荐阅读