如何在Django中为多对多字段添加值
如何在Django中为多对多字段添加值
假设我有一个如下所示的关系:\n
class Student(AbstractBaseUser): # 它继承自AbstractBaseUser并拥有自己的管理器 # 注意:我忘记在这里添加editable id = models.UUIDField(primary_key=True, default=uuid.uuid4) firstname lastname ... class Teacher(models.Model): id = models.UUIDField(default=uuid.uuid4, primary_key=True) firstname lastname email ... class Meeting(models.Model): id = models.UUIDField(default=uuid.uuid4, primary_key=True, editable=False) student = models.ManyToManyField(Student) teacher = models.ManyToManyField(Teacher)
\n我应该如何为字段\'student\'或\'teacher\'添加/设置值。我尝试将相关模型的对象分配给它们,但出现了错误:\n禁止直接对多对多集合的前向侧进行赋值。请使用student.set()代替。\n我也尝试了这样:\n
m = Meeting() s = Student.objects.first() #获取一个随机的学生 m.student.add(s)
\n然后我得到:\nValueError: Cannot add \"
m = Meeting.objects.create() #它只有两个提到的字段。 m.student.add(s)
\n我得到了这个:\ndjango.db.utils.ProgrammingError: column \"meeting_id\" is of type bigint but expression is of type uuid\nLINE 1: ..._meeting\" (\"meeting_id\", \"student_id\") VALUES (\'c7688df9-...\n^\nHINT: You will need to rewrite or cast the expression.
问题的出现原因:
在Django中,当我们有一个多对多字段(ManyToManyField)时,我们需要知道如何向该字段添加值。在上述内容中,我们创建了一个Meeting对象,并且需要将学生和老师与该Meeting对象相关联。
解决方法:
首先,我们需要保存Student对象和Teacher对象。然后,我们创建一个Meeting对象,并将除了多对多字段之外的其他字段添加到该对象中。最后,我们使用add()方法将学生和老师与Meeting对象相关联。
具体代码如下:
>> student_data = {'firstname': 'John', 'last_name', 'Doe'} >> student1 = Student.objects.create(**student_data) >> student_data = {'firstname': 'Test', 'last_name', 'Test'} >> student2 = Student.objects.create(**student_data) >> teacher_data = {'firstname': 'TeacherJohn', 'last_name': 'TeacherDoe', 'email': 'john.doe.com'} >> teacher = Teacher.objects.create(**teacher_data)
接下来,我们创建一个Meeting对象,并将除了多对多字段之外的其他字段添加到该对象中:
meeting = Meeting.objects.create(**the_model_fields_as_dict)
最后,我们使用add()方法将学生和老师与Meeting对象相关联:
meeting.student.add(student1, student2) meeting.teacher.add(teacher)
通过以上步骤,我们成功地将多对多字段的值添加到Django中的Meeting对象中。
问题的出现的原因是在创建Meeting模型之前,将主键更改为UUIDField。解决方法是先删除Meeting模型,运行makemigrations命令,然后创建一个新的Meeting模型,再次运行makemigrations命令,最后运行migrate命令来更新数据库。
代码示例:
# 创建Meeting模型之前 class Meeting(models.Model): # ... # 更改主键为UUIDField class Meeting(models.Model): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) # ... # 解决方法 # 删除旧的Meeting模型 class Meeting(models.Model): # ... # 运行makemigrations命令 $ python manage.py makemigrations # 创建新的Meeting模型 class Meeting(models.Model): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) # ... # 再次运行makemigrations命令 $ python manage.py makemigrations # 运行migrate命令来更新数据库 $ python manage.py migrate
注意:在创建Meeting模型时,需要先保存数据库记录,即使用`m.save()`或`Meeting.objects.create()`。
如果还没有任何会议记录,可以先删除Meeting模型,然后进行迁移,再添加一个新的Meeting模型,以便ForeignKey可以正确链接到正确的字段上。
这样的解决方法已经被验证有效,并且经过了实际测试。