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

The*_*Mir 0 python django

假设我有如下关系:

class Student(AbstractBaseUser):
    # It inherits AbstractBaseUser and has it's own manger
    # note: I did forget to add editable here
    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)
Run Code Online (Sandbox Code Playgroud)

我应该如何为“学生”或“教师”字段添加/设置值。我尝试将相关模型中的对象分配给它们,但收到错误

禁止直接分配到多对多集的前端。使用student.set() 代替。

我也尝试过这个:

m = Meeting()
s = Student.objects.first() #to get a random student
m.student.add(s)
Run Code Online (Sandbox Code Playgroud)

然后我得到: ValueError: Cannot add "<Student: sarah@gmail.com>": 实例在数据库“None”上,值在数据库“default”上

我也这样做了:

m = Meeting.objects.create() #It does only have two mentioned fields.
m.student.add(s)
Run Code Online (Sandbox Code Playgroud)

我得到这个: django.db.utils.ProgrammingError: column "meeting_id" is of type bigint but expression is of type uuid LINE 1: ..._meeting" ("meeting_id", "student_id") VALUES ('c7688df9-.. . ^ 提示:您将需要重写或转换表达式。

Wil*_*sem 5

您创建一个and ,然后用s 和sMeeting填充它,所以:TeacherStudent

s1 = Student.objects.create(firstname='Foo', last_name='Bar')
s2 = Student.objects.create(firstname='Qux', last_name='Qux')
t1 = Teacher.objects.create(
    firstname='Some',
    last_name='One',
    email='someone@something.com'
)

m = Meeting.objects.create()
m.student.add(s1, s2)
m.teacher.add(t1)
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅文档的多对多关系部分。

根据您在问题中分享的例外情况,您在创建 类型的主键之前Meeting创建了模型。我们可以通过以下方式解决这个问题:UUIDField

  1. 删除Meeting模型;
  2. 跑步makemigrations;
  3. 创建一个新Meeting模型;
  4. 再次运行makemigrations; 和
  5. 运行migrate以更新数据库。