Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 882555
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 15, 20262026-05-15T12:26:42+00:00 2026-05-15T12:26:42+00:00

Let’s see if I can explain myself, I have this models: class BillHeader(models.Model): number

  • 0

Let’s see if I can explain myself, I have this models:

class BillHeader(models.Model):
    number = models.CharField(_('Bill number'), max_length=10, unique=True, \
    default=__number)
    client = models.ForeignKey(ClienteYProveedor, verbose_name=_('Client'))
    date = models.DateTimeField(_('Date'), default=datetime.now)

    def __unicode__(self):
        return str(self.number)

    class Meta:
        abstract = True

class BillFooter(models.Model):           
    base_import = models.DecimalField(_('Base import'), max_digits=12, \
    decimal_places=2)

    class Meta:
        abstract = True

class BillBody(models.Model):        
    description = models.CharField(_('Description'), max_length=200)
    amount = models.DecimalField(_('Amount'), max_digits=6, decimal_places=2)
    discount = models.DecimalField(_('Discount'), max_digits=4, \
    decimal_places=2)
    price = models.DecimalField(_('Price'), max_digits=12, decimal_places=2)
    unitaryprice = models.DecimalField(_('Unitary Price'), max_digits=12, \
    decimal_places=2)

    def __unicode__(self):
        return self.description
    class Meta:
        abstract = True

class EmittedBill(BillHeader, BillBody, BillFooter):
    pass

class ReceivedBill(BillHeader, BillBody, BillFooter):
    pass

When the user adds an Emmited or Received bill I need to show BillHeader as a normal fieldset, but BillBody and BillFooter need to be TabularInline.

If I put those as TabularInline in admin.py, an error rises saying that they need a ForeignKey to the related models. Of course, I can’t put those foreign keys, because they are declared at the bottom. I think you guys call this “backwards foreign keys”.

My question is this: how can I do this to show TabularInlines in the admin without making a mess?. I can do it without abstract base classes, but then another problem comes, it shows the other ForeignKey in the TabularInline (if you are on EmmitedBills it shows the FK to ReceivedBills in the TabularInline and viceversa) and I couldn’t been able to exclude them.

Sorry if this is a stupid question, but I’m not a programmer (it’s just a hobby) and I’m really making myself a mess with data models.


I’ll explain better:

I have two types of bills, Emitted and Received and both of them show on the admin home (that’s why I didn’t use a BooleanField to mark them). Both types have the same fields except one, the bill number, which in Emmitted will be autogenerated. Each bill consists on 1 header with number, client and date, 1 or more body inline entries with a description, amount, price, etc. and 1 inline footer, showing the total price without taxes, applied taxes, etc.


Update

I have done everything, but I have a problem, in my new model BillBody has two FK’s (EmmitedBill and ReceivedBill) and they show up in the TabularInline. How can I hide them?field.exclude() gives an error.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-15T12:26:42+00:00Added an answer on May 15, 2026 at 12:26 pm

    I don’t fully understand your question, but you can use

    ForeignKey('ModelName')
    

    instead of

    ForeignKey(ModelName)
    

    if the ModelName model isn’t already declared. Maybe this solves your problem.

    Inline admins (like TabularInline) are only used when you have a one-to-many relation, which is created by a ForeignKey on the many side. If you don’t have such a foreign key, then you cannot use a inline admin. Inheritance is definitely different from a ForeignKey.

    However, I think your data model is wrong. It seems like you do want to store bills. There are two types of bills, emitted and received bills. Both emitted and received bills do have the same fields. Furthermore, you want that each bill consists of a header with number, client and date, 1 or more body entries, where each entry stores the information you store in BillBody and 1 or more decimals base_number.


    A probably better data model for you

    class Bill(models.Model):
        number = models.CharField(_('Bill number'), max_length=10, unique=True, default=__number)
        client = models.ForeignKey(ClienteYProveedor, verbose_name=_('Client'))
        date = models.DateTimeField(_('Date'), default=datetime.now)
    
        def get_total_price(self):
            return sum([entry.price for entry in self.entries])
    
    class BillEntry(models.Model):
        bill = models.ForeignKey(Bill, related_name='entries')
    
        description = models.CharField(_('Description'), max_length=200)
        amount = models.DecimalField(_('Amount'), max_digits=6, decimal_places=2)
        discount = models.DecimalField(_('Discount'), max_digits=4, decimal_places=2)
        price = models.DecimalField(_('Price'), max_digits=12, decimal_places=2)
        unitaryprice = models.DecimalField(_('Unitary Price'), max_digits=12, decimal_places=2)
    

    I have left out the __unicode__ methods.

    Now you have a foreign key from BillEntry to Bill and you can use a tabular inline. I didn’t understand your usage of base_import so I left this out.

    Price computation

    If your price should always equal something like amount*unitaryprice - discount or amount*(unitaryprice-discount) then you shouldn’t put this in a field but either compute it when it is needed, either in Python or in the database. If you want to do this in Python you can use a method similar to get_total_price. If you want to compute them when querying the database then it is a little bit more difficult to get it working with Django.

    In the last case, you can have a look at SQL views, but I think this is a little bit too difficult for a beginner. Another option is to use a custom SQL expression:

    BillEntry.objects.extra(select={'price': 'amount*unitaryprice-discount'})
    

    This will compute the price for all entries during selection.

    Update

    If you add two subclasses for emitted and received bills and use multi table inheritance then you can use one foreign key from BillEntry to Bill.

    class EmittedBill(Bill):
        pass
    
    class ReceivedBill(Bill):
        pass
    

    You probably also have to think about the database model generated by Django. Usually, you only want to store elementary data in the database, and not computed data (like you want to do in your footer). So, if prices are computed using some formula and using the unitaryprice, amount etc. you shouldn’t store the result of this formula but recompute it when necessary (and eventually cache to avoid re-computations). If you don’t do this, chances are that you at some moment update something (for example the amount) and forget to update the computed values (the price) which leads to inconsistencies in your database (and thus bugs in your application). A good database does have constraints so that it is impossible to store inconsistent database without breaking at least one constraint.

    I also don’t see why you want a separate header and footer per bill. A model isn’t the real bill, it stores the information for a bill. If you want to have a visible header and footer, then you should do this in your view layer (the template) and not in the model itself.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.