django - 创建带有外键的对象
问题描述
每当我尝试在下面的代码中运行“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()
解决方案
您有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 实例相关。
您可以关注官方文档链接以获取更多详细信息和示例。
推荐阅读
- python - 我的 OpenCV 双线性调整大小的实现不正确
- java - 如何获取日历 API 类定义和库,续
- sparql - 如何使用 sparql 更新/插入 objectPropertyAssertion 的注释?
- actions-on-google - Android 设备上带有破解/失真的音频直播
- c# - 不支持连接字符串关键字“数据源”。对于可能的替代方案
- python - 按列分组并在两个组中查找 ID
- sql - 如何在 PostgreSQL 中按时间间隔聚合行数?
- c# - 如何编写 C# 脚本来处理 SSIS 中 csv 字段中的双引号
- ruby - 如何在 Ruby 循环中使用 XPath 循环
- c - 通过我的函数传递单词的问题