title: Create a new model which have all fields of currently existing model
body: <p>I am having a model <code>Player</code> with my django app .</p>
  
  <pre><code>class Player(models.Model):
      """ player model """
      name = models.CharField(max_length=100, null=True, blank=True)
      date_created = models.DateTimeField(auto_now_add=True)
      last_updated = models.DateTimeField(auto_now=True)
      hash = models.CharField(max_length=128, null=True, blank=True)
      bookmark_url = models.CharField(max_length=300, null=True, blank=True)
  </code></pre>
  
  <p>As per my requirement i need to create a new model <code>BookmarkPlayer</code>which will have all fields of <code>Player</code> model.</p>
  
  <p>Right now i have two things into my mind to do this .</p>
  
  <ol>
  <li>I can extend Player class for BookmarkPlayer model.</li>
  </ol>
  
  <pre>
      class BookmarkPlayer(Player):
          """ just a bookmark player"""
          class Meta:
              app_label = "core"
  </pre>    
  
  <ol start="2">
  <li>I can define all fields of Player model into BookmarkPlayer model.</li>
  </ol>
  
  <pre>
       class BookmarkPlayer(models.Model):
              """ bookmark player model """
              name = models.CharField(max_length=100, null=True, blank=True)
              date_created = models.DateTimeField(auto_now_add=True)
              last_updated = models.DateTimeField(auto_now=True)
              hash = models.CharField(max_length=128, null=True, blank=True)
              bookmark_url = models.CharField(max_length=300, null=True, blank=True)
  </pre>
  
  <p>I just want to know which way is  better to do this .Please share with my if there is another good way.</p>
  
  <p><strong><em>Updated Question</em></strong></p>
  
  <p>Knbb's idea to  create a base class is interesting but i am facing issue with one of my model which is already existed into database.   </p>
  
  <p><strong>My actual models :</strong></p>
  
  <pre>
  class Address(models.Model):
      address = models.TextField(null=True, blank=True)
  
  
  class Site(models.Model):
      domain = models.CharField(max_length=200)
  
  
  class Player(models.Model):
      # ... other fields
      shipping_address = models.ForeignKey(Address, related_name='shipping')
      billing_address = models.ForeignKey(Address, related_name='billing')
      created_at = models.DateTimeField(auto_now_add=True)
      updated_at = models.DateTimeField(auto_now_add=True)
      site = models.ManyToManyField(Site, null=True, blank=True)
  
      class Meta:
         abstract = True
  </pre>
  
  <p><strong>Models after changes  :</strong></p>
  
  <pre>
  class Address(models.Model):
      address = models.TextField(null=True, blank=True)
  
  
  class Site(models.Model):
      domain = models.CharField(max_length=200)
  
  
  class BasePlayer(models.Model):
      # .. other fields
      shipping_address = models.ForeignKey(Address, related_name='shipping')
      billing_address = models.ForeignKey(Address, related_name='billing')
      created_at = models.DateTimeField(auto_now_add=True)
      updated_at = models.DateTimeField(auto_now_add=True)
      site = models.ManyToManyField(Site, null=True, blank=True)
  
      class Meta:
         abstract = True
  
  class Player(BasePlayer):
     class Meta:
         app_label = 'core'
  
  
  class BookmarkPlayer(BasePlayer):
      class Meta:
          app_label = 'core'
  
  </pre>    
  
  <p>After these changes when i am running my django server i am getting errors given below.</p>
  
  <pre>
  django.core.management.base.CommandError: One or more models did not validate:
  core.test1: Accessor for field 'shipping_address' clashes with related field 'Address.shipping'. Add a related_name argument to the definition for 'shipping_address'.
  core.test1: Reverse query name for field 'shipping_address' clashes with related field 'Address.shipping'. Add a related_name argument to the definition for 'shipping_address'.
  core.test1: Accessor for field 'billing_address' clashes with related field 'Address.billing'. Add a related_name argument to the definition for 'billing_address'.
  core.test1: Reverse query name for field 'billing_address' clashes with related field 'Address.billing'. Add a related_name argument to the definition for 'billing_address'.
  core.test2: Accessor for field 'shipping_address' clashes with related field 'Address.shipping'. Add a related_name argument to the definition for 'shipping_address'.
  core.test2: Reverse query name for field 'shipping_address' clashes with related field 'Address.shipping'. Add a related_name argument to the definition for 'shipping_address'.
  core.test2: Accessor for field 'billing_address' clashes with related field 'Address.billing'. Add a related_name argument to the definition for 'billing_address'.
  core.test2: Reverse query name for field 'billing_address' clashes with related field 'Address.billing'. Add a related_name argument to the definition for 'billing_address'
  </pre>
  
  <p><strong>Answer :</strong><br>
  Finally i got answer if we are using the related_name attribute on a ForeignKey or ManyToManyField into a Abstract model.<br>
  This would normally cause a problem in abstract base classes, since the fields on this class are included into each of the child classes, with exactly the same values for the attributes (including related_name) each time .<br>
  To work around this problem, when you are using related_name in an abstract base class (only), part of the name should contain '%(app_label)s' and '%(class)s'.<br>
  <a href="https://docs.djangoproject.com/en/dev/topics/db/models/#abstract-base-classes" rel="noreferrer">https://docs.djangoproject.com/en/dev/topics/db/models/#abstract-base-classes</a><br>
  Now my BasePlayer model is     </p>
  
  <pre>
  class BasePlayer(models.Model):
      # .. other fields
      shipping_address = models.ForeignKey(Address, related_name='%(app_label)s_%(class)s_shipping')
      billing_address = models.ForeignKey(Address, related_name='%(app_label)s_%(class)s_billing')
      created_at = models.DateTimeField(auto_now_add=True)
      updated_at = models.DateTimeField(auto_now_add=True)
      site = models.ManyToManyField(Site, null=True, blank=True)
  
      class Meta:
         abstract = True
  </pre>