[英]Django REST framework: deserializing foreign key fails (many-to-many)
[英]Django Get Foreign Key Value in Many-to-Many
Django 相對較新,所以這可能很簡單,只是缺少一些東西。 鑒於這些模型:
class Manager(models.Model):
mgrname = models.CharField(max_length=100)
class Salesperson(model.Model):
name = models.CharField(max_length=100)
mgr_name = models.ForeignKey(SalesMgr,on_delete=models.CASCADE)
class SalesList(models.Model):
list_description = modesl.CharField(max_length=100)
list_members = models.ManyToManyFiels('Salesperson')
每個銷售人員都被分配了一個經理(只有一個 - 經理有很多銷售人員)。 我的用戶可以創建一個任意聯系人列表(“SalesList”),其中包含任意數量的銷售人員(銷售人員可以屬於許多列表。一個列表可能包含許多銷售人員)。
我可以檢索選定列表中的銷售人員列表,但我需要包含銷售經理的姓名。
選擇列表后如何檢索經理姓名?
謝謝!
您需要創建一個額外的 model 並在 ManytoManyField 中使用“through=new_model”。
class Manager(models.Model):
mgrname = models.CharField(max_length=100)
class Salesperson(model.Model):
name = models.CharField(max_length=100)
mgr_name = models.ForeignKey(SalesMgr,on_delete=models.CASCADE)
class SalesList(models.Model):
list_description = modesl.CharField(max_length=100)
list_members = models.ManyToManyField('Salesperson', through='Manager')
https://docs.djangoproject.com/en/3.0/topics/db/models/#extra-fields-on-many-to-many-relationships
您可以簡單地遍歷Salesperson
並訪問.mgr_name
,然后訪問mgrname
,例如:
sales_list = SalesList.objects.first() # some SalesList record
for salesperson in sales_list.list_members.all():
print((salesperson.name, salesperson.mgr_name.mgrname))
但是,這將對列表中的每個SalesPerson
進行額外查詢,這不是一個好主意。 當我們獲取SalesPerson
時,您可以使用.select_related(…)
[Django-doc]獲取經理 object:
sales_list = SalesList.objects.first() # some SalesList record
for salesperson in sales_list.list_members.select_related('mgr_name'):
print((salesperson.name, salesperson.mgr_name.mgrname))
注意:
ForeignKey
不會將引用的 object 的字符串表示形式(或名稱)存儲在列中,它會將其引用的記錄的主鍵存儲在具有_id
后綴的ForeignKey
字段的列中。 因此ForeignKey
通常不以_name
后綴結尾。 您可能需要考慮將字段重命名為mgr_name
manager
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.