/ / Django - použitie rovnakého modelu dvakrát v množine polí - django, django-models

Django - Použitie rovnakého modelu dvakrát v poli - django, django-models

"Rád by som použil model Party dvakrát (ale s rôznymi hodnotami) v množine polí v paneli Správca, ale nemôžem zistiť, ako na to." Existuje spôsob? Akákoľvek pomoc sa cení!

from django.contrib import admin
from mvp.models import Contract, Party
# Register your models here.

class ContractAdmin(admin.ModelAdmin):

fieldsets = [
(None,               {"fields": ("contract_number", "contract_type", "contract_startdate", "contract_enddate","contract_renewaldate", "contract_value", "contract_currency", "party")}),
]

search_fields = ["contract_number", "party__party_name"]
list_display = ("contract_number", "contract_type", "contract_startdate", "contract_enddate", "contract_renewaldate")


admin.site.register(Contract, ContractAdmin)
admin.site.register(Party)

A tu je models.py

class Party(models.Model):
party_name = models.CharField("Name", max_length=60)
party_street = models.CharField("Street", max_length=60)
party_city = models.CharField("City", max_length=60)
party_zip = models.CharField("Zip/Postal Code", max_length=60)
party_country = models.CharField("Country", max_length=60)
party_email = models.CharField("Email", max_length=60)
party_fax = models.CharField("Fax", max_length=60)
party_phone = models.CharField("Phone", max_length=60)
def __unicode__(self):
return self.party_name
pass

class Contract(models.Model):
CONTRACT_TYPES = (
("PNS", "Purchase and Sale"),
("CDA", "Confidential Disclosure Agreement"),
("DIS", "Distribution"),
("LIC", "Licensing Agreement"),
("SOW", "Statement of Work"),
("IMP", "Implementation Agreement"),
)
CURRENCY_TYPES = (
("CAD", "CAD"),
("EUR", "EUR"),
("USD", "USD"),
)
party = models.ForeignKey(Party)
contract_number = models.CharField("Contract Number", db_index=True,     max_length=60, primary_key=True)
contract_type = models.CharField("Contract Type", db_index=True, max_length=3, choices=CONTRACT_TYPES)
contract_startdate = models.DateField("Start Date")
contract_enddate = models.DateField("End Date")
contract_renewaldate = models.DateField("Renewal Date")
contract_value = models.IntegerField("Value")
contract_currency= models.CharField("Currency", db_index=True, max_length=3, choices=CURRENCY_TYPES)
def __unicode__(self):
return self.contract_type

odpovede:

0 pre odpoveď č. 1

Momentálne máte ForeignKey vzťah z Contract na Party, čo znamená, že si môžete vybrať iba jednu Party za Contract. Tento vzťah sa nazýva „vzťah jeden k mnohým“. Mali by ste urobiť, aby ste to zmenili na vzťah „od mnohých k mnohým“.

Zmeniť riadok:

party = models.ForeignKey(Party)

na

party = models.ManyToManyField(Party)

Potom môžete vo svojom ModelAdmin použiť filter_vertical alebo filter_horizontal na pridanie / odstránenie strán:

class ContractAdmin(admin.ModelAdmin):
....
filter_horizontal = ("party",)

aktualizovať: Ak budete potrebovať iba 2 strany, ktoré majú byť spojené so zmluvou, môžete jednoducho pridať druhé pole pridaním

party2 = models.ForeignKey(Party, related_name="contract2")

ale v tomto prípade nebudete mať prístup k dobrotám Django ORM, ako je získanie všetkých zmlúv týkajúcich sa strany jednoduchým napísaním party.contracts. Ak nikdy nebudete potrebovať spätný chod; môžeš použiť related_name="+" úplne vypnúť.


-1 pre odpoveď č. 2

Vytvorte inline model pre párty

from django.contrib import admin

class PartyAdmin(admin.ModelAdmin):
list_display = ("party_name",)

class PartyInline(admin.TabularInline):
model = Party

class ContracAdmin(admin.ModelAdmin):
fieldsets = [
(None,               {"fields": ("contract_number", "contract_type", "contract_startdate", "contract_enddate","contract_renewaldate", "contract_value", "contract_currency")}),
]

search_fields = ["contract_number", "party__party_name"]
list_display = ("contract_number", "contract_type", "contract_startdate", "contract_enddate", "contract_renewaldate")
inlines = [
PartyInline,
]


admin.site.register(Contract, ContractAdmin)
admin.site.register(Party, PartyAdmin)