如何在Django中为多对多字段添加值

21 浏览
0 Comments

如何在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 \"\": instance is on database \"None\", value is on database \"default\"\n我也尝试了这样:\n

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.

0
0 Comments

问题的出现原因:

在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对象中。

0
0 Comments

问题的出现的原因是在创建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可以正确链接到正确的字段上。

这样的解决方法已经被验证有效,并且经过了实际测试。

0