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", ]

inline

Я понял это примерно через 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
Вернуться на верх