Django Admin Отношения один-ко-многим-одному (Сайт->Продукт->Цена)
Я разрабатываю веб-приложение для развлечения, и цель состоит в том, чтобы использовать Django Admin и только Django Admin, без каких-либо пользовательских шаблонов (пока). Я не могу понять, как мне следует структурировать мои файлы models.py и admin.py, где я пытаюсь сделать следующее:
Существует множество предметов и множество отделов: Каждый предмет может принадлежать только одному отделу, а каждый отдел может иметь несколько предметов. В настоящее время это работает.
Теперь, что я никак не могу понять, так это:
Существует множество сайтов. На каждом сайте может быть много товаров, но ЦЕНА каждого товара на каждом сайте может быть разной. Например:
Сайт №123 может получить банку колы за $1.00 Сайт №124 также может взять банку колы, но по цене $0,95 Сайт #123 может взять пакет чипсов за $1.50 Сайт №124 также может иметь пакет чипсов, но по цене $1.95 и т.д...
Как установить эту связь в Django models.py/admin.py? Также, как я могу редактировать цену, используя inline (скриншот ниже)? Другими словами, как можно показать цену справа от описания?
Заранее спасибо
Текущий код:
admin.py:
from django.contrib import admin
from .models import Site, Department, Item
class ItemInline(admin.TabularInline):
model = Site.items.through
can_delete = False
verbose_name = 'Item'
verbose_name_plural = 'Items'
extra = 0
@admin.register(Site)
class SiteAdmin(admin.ModelAdmin):
fields = ("site", "address")
list_display = ("site", "address")
inlines = (ItemInline, )
exclude = ("items", )
@admin.register(Department)
class DepartmentAdmin(admin.ModelAdmin):
fields = ("number", "description")
list_display = ("number", "description")
@admin.register(Item)
class ItemAdmin(admin.ModelAdmin):
fields = ("upc", "description", "department")
list_display = ("upc", "description", "department")
save_as = True
def formfield_for_dbfield(self, *args, **kwargs):
formfield = super().formfield_for_dbfield(*args, **kwargs)
formfield.widget.can_delete_related = False
formfield.widget.can_change_related = False
formfield.widget.can_add_related = False
# formfield.widget.can_view_related = False
return formfield
models.py:
from django.db import models
class Department(models.Model):
number = models.IntegerField(unique=True)
description = models.CharField(max_length=30)
def __str__(self):
return str(self.number) + ": " + self.description
class Meta:
ordering = ["number", ]
class Item(models.Model):
upc = models.CharField(max_length=30, unique=True, verbose_name="UPC")
description = models.CharField(max_length=30)
department = models.ForeignKey(Department, on_delete=models.SET_NULL, null=True)
def __str__(self):
return self.upc + ": " + self.description
class Meta:
ordering = ["upc", ]
class Site(models.Model):
site = models.IntegerField(unique=True)
address = models.CharField(max_length=50)
items = models.ManyToManyField(Item)
def __str__(self):
return str(self.site)
class Meta:
ordering = ["site", ]
Я понял это примерно через 20 минут после публикации. Ключ заключался в создании новой модели (с именем ItemPrice) с сайтом, upc и ценой - с сайтом и upc FK's к Site и Item. Затем я создал новый инлайн, указывающий на ItemPrice:
class ItemPrice(models.Model):
site = models.ForeignKey(Site, on_delete=models.CASCADE, null=True)
upc = models.ForeignKey(Item, on_delete=models.CASCADE, null=True, verbose_name="UPC")
price = models.DecimalField(max_digits=6, decimal_places=2, default=0)
class Meta:
constraints = [
models.UniqueConstraint(fields=['site', 'upc'], name='unique_site_upc')
]
и
class ItemPriceInline(admin.TabularInline):
model = ItemPrice
# can_delete = False
verbose_name = 'Item Price'
verbose_name_plural = 'Item Prices'
extra = 0