簡體   English   中英

Django 以多對多方式獲取外鍵值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM