Джанго админ модель отношений - PullRequest
0 голосов
/ 01 мая 2019

Итак, я строю веб-сайт магазина, у меня есть 2 приложения, одно приложение называется «Магазин», у него есть две модели «Магазин» и «UnitStore».Второе приложение называется Product, тогда как оно получило отдельные модели с именем Store.

В администраторе Product я использую метод formfield_for_foreignkey для отображения StoreUnit и Store следующим образом: "Store_name | Unit_name"

Итакмоя проблема в том, что когда я пытаюсь создать продукт, он всегда запрашивает внешний ключ UnitStore, но не все продукты поступают из UnitStore, некоторые продукты можно найти только в магазине, поэтому я не могу создатьinstance.

- Store > Models.py 

class Store(models.Model):

    store_name = models.CharField(max_length=200)
    created_at = models.DateTimeField(auto_now_add=True)
        updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.store_name 

class UnitStore(models.Model):

    store_unit_name = models.CharField(max_length=200)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    store = models.ForeignKey(
        Store,
        related_name='units',
        on_delete=models.CASCADE,
    )

    def __str__(self):
        return self.store_unit_name 


Product > Models.py

class Product(models.Model):

    product= models.CharField(max_length=200)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    store_unit_name = models.ForeignKey(
        StoreUnit,
        related_name='units',
        on_delete=models.CASCADE,
    )

    def __str__(self):
        return self.product

- Product > Admin.py

class CustomProduct(admin.ModelAdmin):
    model = Product
    list_display = ('product', 'created_at', 'aupdated_at',
                    'store_unit_name',)
    list_select_related = ('store_unit_name')
    fieldsets = (
        ("Prodcut's Name:", {
            'fields': ('product',)}),
        ('Store:', {
            'fields': ('store_unit_name',)}),  
    )

    def save_model(self, request, obj, form, change):
        obj.created_by = request.user
        super().save_model(request, obj, form, change)

Должен ли я добавить еще один внешний ключ к моделям продукта, как в примере ниже.поэтому я должен иметь доступ к продукту по: product.store.store_name.

class Product(models.Model):

    product= models.CharField(max_length=200)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    store_unit_name = models.ForeignKey(
        StoreUnit,
        related_name='units',
        on_delete=models.CASCADE,
    )
  store= models.ForeignKey(
        Store,
        related_name='stores',
        on_delete=models.CASCADE,
    )

1 Ответ

0 голосов
/ 01 мая 2019

У вас должна быть модель Магазина, которая фиксирует как хранилища, так и хранилища единиц, а метод __str__ должен всегда печатать имя основного хранилища и имя хранилища единиц, если применимо:

class Store(models.Model):

    store_name = models.CharField(max_length=200)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    main_store = models.ForeignKey(
        'Store',
        null=True,
        related_name='units',
        on_delete=models.CASCADE,
    )

    def __str__(self):
        ret_value = self.main_store.store_name + " | " if self.main_store else ""
        return ret_value + self.store_name

Если у вас есть такая модель, у вас может быть только один внешний ключ, указывающий на магазин или универмаг.

class Product(models.Model):

    product = models.CharField(max_length=200)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    store= models.ForeignKey(
        Store,
        related_name='products',
        on_delete=models.CASCADE,
    )
...