django queryset - нужен совет по запросу в представлении - фильтры и настройка отношений - PullRequest
0 голосов
/ 02 апреля 2012

Я пытаюсь создать шаблон / отчет, в котором перечислены все объявления (объявления) для клиента.Почти все относится к идентификатору таблицы листингов.У клиента может быть много списков, список может иметь только один тип списка, а список может иметь много изображений.Я знаю, что мой view.py испорчен - в идеале я хотел бы отправить минимальный объем данных в шаблон.Поэтому я хотел бы отправлять только списки, изображения и данные о типах (1, 2 или 3), которые относятся к спискам для конкретного клиента.Я борюсь с набором запросов и строю контекст.Я уверен, что мне нужно добавить в контекст больше объектов, чем указано в списке.

Я предполагаю, что как только я получу данные в шаблон, мне придется строить таблицу построчно и делатьнекоторые if / then заполняют шаблон, чтобы иметь дело с различными типами листинга.Дайте мне знать, если вам известен более простой способ.

Models.py

class Customer(models.Model):
    name = models.CharField(max_length=20, blank=True)
    email = models.CharField(max_length=50, blank=True)
    user = models.ForeignKey(User, unique=True)
    def __unicode__(self):
        return unicode(self.user)

class ListingType(models.Model):
    desc = models.CharField(max_length=35, blank=True)
    def __unicode__(self):
        return self.desc

class Listings(models.Model):
    createdate = models.DateTimeField(auto_now_add=True)
    price = models.IntegerField(null=True, blank=True)
    listing_type = models.ForeignKey(ListingType)
    customer = models.ForeignKey(Customer)

class Listingtype1(models.Model):
    manufacturer = models.CharField(max_length=35, blank=True)
    mfg_no = models.CharField(max_length=35, blank=True)
    typespecific1 = models.CharField(max_length=35, blank=True)
    typespecific2 = models.CharField(max_length=35, blank=True)
    listings = models.ForeignKey(Listings)

class Listingtype2(models.Model):
    manufacturer = models.CharField(max_length=35, blank=True)
    mfg_no = models.CharField(max_length=35, blank=True)
    typespecific1 = models.CharField(max_length=35, blank=True)
    typespecific2 = models.CharField(max_length=35, blank=True)
    listings = models.ForeignKey(Listings)

class Listingtype3(models.Model):
    manufacturer = models.CharField(max_length=35, blank=True)
    mfg_no = models.CharField(max_length=35, blank=True)
    typespecific1 = models.CharField(max_length=35, blank=True)
    typespecific2 = models.CharField(max_length=35, blank=True)
    listings = models.ForeignKey(Listings)

class Image(models.Model):
    title = models.CharField(max_length=60, blank=True, null=True)
    image = models.ImageField(upload_to="images/", blank=True, null=True)
    thumbnail = models.ImageField(upload_to="images/", blank=True, null=True)
    listings = models.ForeignKey(Listings)

Views.py (работа в процессе)

def listings_customer(request, user_id):
    customer = get_object_or_404(Customer, user=user_id)
    cusnum=customer.id
    listings = Listings.objects.filter(customer=cusnum)
    image = Image.objects.all()
    context=Context({
        'title': 'Listings',
        'customer': customer,
        'listings' : listings,        
        'image' : image,        
        })
    return render_to_response('bsmain/listings.html', context)    

1 Ответ

1 голос
/ 03 апреля 2012

Посмотрите на поиск с отношениями и обратные отношения , чтобы вы могли связать все свои модели в цепочки, такие как:

Image.objects.filter(listings__customer=customer)

Также несколько оффтопных советов.

список будет иметь только один тип списка

Так что вы должны использовать OneToOneField здесь

Вам не нужно извлекать customer.id, используйте customer для поиска.

Используйте не множественные имена для своих моделей (Listings должно быть Listing) и избегайте дублирования кода, как в ListingType1 и ListingType2, используйте наследование модели

...