我是 Django DRF 的新手,正在嘗試完成一個體校專案。我有教練、班級和學生的模型。這是一個精簡的版本,以使其簡單易行:
class Student (models.Model):
first_name = models.CharField(max_length = 50)
last_name = models.CharField(max_length = 50)
def __str__(self):
return f'{self.first_name} {self.last_name}'
class Coach (models.Model):
first_name = models.CharField(max_length = 50)
last_name = models.CharField(max_length = 50)
def __str__(self):
return f'{self.first_name} {self.last_name}'
class ClassDetails (models.Model):
class_name = models.CharField(max_length = 50)
class_coach = models.ForeignKey(Coach, related_name='coach_classes')
class_members = models.ManyToMany(Student, related_name='student_classes')
def __str__(self):
return self.class_name
為了在課堂上列出/添加學生,我使用了以下序列化程式:
class ClassDetailsSerializer(serializers.ModelSerializer):
class Meta:
model = ClassDetails
fields = ['id','class_name', 'class_coach', 'class_members]
read_only_fields = ('id', 'class_name', 'class_coach')
獲取資料作業正常。另外,添加教練效果很好,真正讓我難過的是添加班級成員。我正在使用以下視圖:
def member_add(self, request):
my_class = ClassDetails.objects.get(pk = request.data['id']
serializer = ClassDetailsSerializer(my_class, data=request.data)
if serializer.is_valid():
serializer.save()
return Response('Member added', status.HTTP_201_CREATED)
return Response(serializer.errors, status.HTTP_406_NOT_ACCEPTABLE)
我正在發送一個 POST 正文,例如:
{
"id": 2, <- class id
"class_members": [20] <- student's id to add to the class members
}
問題是無論班上有多少學生,上面的方法都會將他們全部洗掉,并將學生 id 20 改為。
- 我怎樣才能保留當前的學生,只為他們添加新的 id?
- 如何在不洗掉 class_members 欄位中的整個資料的情況下洗掉學生的 id?
謝謝!
uj5u.com熱心網友回復:
我想說以不同的方式定義您的模型,這是一個示例-
首先定義您的類詳細資訊,例如-
class ClassDetails (models.Model):
class_name = models.CharField(max_length = 50)
def __str__(self):
return self.class_name
然后定義您的學生,例如 -
class Student (models.Model):
first_name = models.CharField(max_length = 50)
last_name = models.CharField(max_length = 50)
classDetail = models.ForeignKey(ClassDetails)
def __str__(self):
return f'{self.first_name} {self.last_name}'
最后是你的教練——
class Coach (models.Model):
first_name = models.CharField(max_length = 50)
last_name = models.CharField(max_length = 50)
classDetail = models.ForeignKey(ClassDetails)
def __str__(self):
return f'{self.first_name} {self.last_name}'
這樣您就可以使用嵌套功能 - 現在您的學生始終與課程相關聯,您的教練也與您的課程相關聯。
現在你可以說每個班級可以有多個學生,每個班級也可以有多個教練。現在,如果每個班級的教練都是獨一無二的,您可以將教練模態寫為 -
class Coach (models.Model):
first_name = models.CharField(max_length = 50)
last_name = models.CharField(max_length = 50)
classDetail = models.OneToOneField(ClassDetails)
根據輸入編輯我的答案——
要首先在 manytomany 型別欄位中添加一個新 id,您必須為例如創建一個學生。
s = Student.objects.create()
然后做類似的事情
my_class = ClassDetails.objects.get(pk = request.data['id'])
獲取正確的 classdetail 實體,然后執行以下操作 -
my_class.class_members.add(s)
將新學生添加到 ClassDetails 中的 manytomany 欄位
您可以根據自己的需要進行自定義,希望對您有所幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/422835.html
標籤:
上一篇:如何向api發出請求
