I'm still struggling with obtaining a nice list of items for a samurai in
the admin view. I can iterate over them in a template, but I want to get
them all at once in an admin view without iteration. I have a separate model
for Inventory which has foreign keys for Samurai and Item. The trick is to
see a list of items that each samurai has in the admin view without having
to iterate. Actually, iteration would be okay as long as it fit in the items
column of the admin view.

For example, I do this:

** models.py **
class Samurai(models.Model):
   # other stuff

    def items(self):
        return self.inventory_set.filter(samurai = self.pk).values_list('item',
flat=True).order_by('item')

** admin.py **
class SamuraiAdmin(admin.ModelAdmin):
    list_display = ('name', 'family_name', 'id', 'room', 'items')

** / code **

But in the 'items' column, it outputs:
[u'O-yoroi', u'Rice', u'Sharp Katana', u'Wakizashi']

How can I construct the query set to just print the list (without the [ ]
brackets) and without the unicode u in front of everything? Like this:
O-yoroi, Rice, Sharp Katana, Wakizashi

Thank you for your time.

-Tim





On Fri, Feb 19, 2010 at 3:48 PM, Timothy Kinney <timothyjkin...@gmail.com>wrote:

> Thanks again for the help, and thank you very much for the links! I have
> been looking for examples of django rpgs with little success. Once I get
> something functional I plan to contribute to the open-source community as
> well.
>
> Cheers.
>
> -Tim
>
>
>
> On Fri, Feb 19, 2010 at 3:02 PM, Tim Shaffer <timster...@gmail.com> wrote:
>
>> You should be able to list all of a samurai's items by doing the
>> following:
>>
>> samurai = Samurai.objects.get(pk=1)
>> for inv in samurai.inventory_set.all():
>>    print inv.item.name
>>
>> samurai.inventory_set returns a QuerySet the same way that
>> Inventory.objects returns a QuerySet, but it only returns inventory
>> items belonging to that specific samurai.
>>
>> So this:
>>
>> s = Samurai.objects.get(pk=1)
>> s.inventory_set.all()
>>
>> Is essentially the same as doing this:
>>
>> s = Samurai.objects.get(pk=1)
>> Inventory.objects.filter(samurai=s)
>>
>> I've actually also researched RPG-like environments in Django. Check
>> out these links, if you haven't already, for some sample code. Seems
>> to be the best I've found so far.
>>
>> http://code.google.com/p/django-mmo/
>>
>> http://www.rkblog.rk.edu.pl/w/p/code-snapshot-ice-isle-django-web-crpg-game/
>> http://github.com/batiste/django-rpg
>>
>> sounds like it could be a great project. have fun!
>>
>> On Feb 19, 2:18 pm, Timothy Kinney <timothyjkin...@gmail.com> wrote:
>> > Hi Tim,
>> >
>> > Thanks for the concrete examples. I actually had exactly what you had
>> coded
>> > last night, but I got rid of it because having multiple inventories for
>> a
>> > single samurai seemed counter-intuitive to me. But it sounds like it's
>> the
>> > best way to get the granularity I want.
>> >
>> > Going back to that system I have a different problem then. If I want to
>> list
>> > all of the items that a samurai has in his inventory I would like to use
>> a
>> > samurai.item_set method, but this method fails with multiple
>> inventories. It
>> > also didn't seem to work with a samurai.inventory_set method.
>> >
>> > I'm okay with having multiple inventories for one samurai, but what is
>> the
>> > best practice for accessing them all as one inventory?
>> >
>> > I apologize for the intensive questioning. I hope this discussion is
>> helping
>> > other users who are new to django. I had searched extensively for django
>> > implementations of RPG-like inventories and characters and didn't find
>> any.
>> > I'm sure there are other people in the same boat.
>> >
>> > Cheers.
>> >
>> > -Tim
>> >
>> > On Fri, Feb 19, 2010 at 7:49 AM, Tim Shaffer <timster...@gmail.com>
>> wrote:
>> > > Basically what you are trying to do is called a many-to-many
>> > > relationship with an intermediary table.
>> >
>> > > If it was a regular many-to-many relationship, you could just do
>> > > ManyToManyField(Item) on the samurai model, and there would be a table
>> > > with a foreign key to item, and a foreign key to samurai, and nothing
>> > > else. But since you need to specify attributes about each of those
>> > > relationships (in this case, condition), you have to use an
>> > > intermediary table (Inventory) with those foreign keys, plus your
>> > > additional attributes. It's not uncommon thing to do at all.
>> >
>> > > So if you are using an Inventory class like that, you would want to
>> > > have this:
>> >
>> > > item = models.ForeignKey(Item)
>> >
>> > > instead of this:
>> >
>> > > item_id = models.ManyToManyField(Item)
>> >
>> > > Think of one inventory record as one item belonging to one samurai,
>> > > with a condition. So if a samurai has more than one of the same same
>> > > item, he would have more than one inventory record.
>> >
>> > > If you were creating your models starting from scratch, you might come
>> > > up with Inventory usage that looks something like this (pseudo code):
>> >
>> > > Inventory.create(samurai='Tim', item='Item 1', condition='100%')
>> > > Inventory.create(samurai='Tim', item='Item 1', condition='75%')
>> > > Inventory.create(samurai='Tim', item='Item 2', condition='100%')
>> >
>> > > Looking at this, you can determine that each inventory has only one
>> > > item (foreign key to item), one samurai (foreign key to samurai), and
>> > > one condition (just an integer). So then you can take that and
>> > > translate it to a Django model:
>> >
>> > > class Inventory(models.Model):
>> > >    samurai = models.ForeignKey('Samurai')
>> > >    item = models.ForeignKey(Item)
>> > >     condition = models.IntegerField(default=100, blank=True,
>> > > verbose_name='condition')
>> >
>> > > Hope this helps.
>> >
>> > > On Feb 19, 3:53 am, Timothy Kinney <timothyjkin...@gmail.com> wrote:
>> > > > Okay, I'm still lacking understanding on the inventory part. Here's
>> what
>> > > I
>> > > > have so far:
>> >
>> > > > class Inventory(models.Model):
>> > > >     id = models.AutoField(primary_key=True,
>> verbose_name="inventory")
>> > > >     samurai_id = models.ForeignKey('Samurai')
>> > > >     item_id = models.ManyToManyField(Item)
>> > > >     condition = models.IntegerField(default=100, blank=True,
>> > > > verbose_name='condition')
>> >
>> > > > This has almost all the functionality I want. I can assign a single
>> > > > inventory to a single samurai, and I can add multiple items to the
>> > > > inventory. The problem is that I can't associate a unique condition
>> (100%
>> > > or
>> > > > less) with each item. And I can't seem to add the same item twice.
>> >
>> > > > I would like to have an inventory that looked like this:
>> >
>> > > > Inventory for Samurai Sam:
>> > > > (item - condition)
>> > > > Item1 - 100%
>> > > > Item1 - 75%
>> > > > Item2 - 100%
>> >
>> > > > -Tim
>> >
>> > > > On Thu, Feb 18, 2010 at 7:27 PM, Tim Shaffer <timster...@gmail.com>
>> > > wrote:
>> > > > > 1) You can change this in your model. Check out "verbose_name" and
>> > > > > "verbose_name_plural" for the model's Meta class.
>> >
>> > > > >http://docs.djangoproject.com/en/dev/ref/models/options/
>> >
>> > > > > 2) If you have a ManyToMany field to samurai on the item, you
>> don't
>> > > > > need the inventory model at all. A samurai's inventory could be
>> > > > > obtained by doing "samurai.item_set" and it would return all their
>> > > > > items. There are different reasons to do each one. However.....
>> >
>> > > > > 3) Duplicates can be done by using the Inventory model. You could
>> > > > > either add a new field called quantity, or simply have multiple
>> > > > > Inventory records per item and samurai. If each item can have
>> specific
>> > > > > attributes (for example, I can have 2 of the same item, one of
>> which
>> > > > > has 55% durability, and the other has 70% durability) you would
>> want
>> > > > > to have separate records, and could put these attributes on the
>> > > > > inventory model or item model. But if each item is the same, it's
>> > > > > easier to just use a quantity field.
>> >
>> > > > > 4) If status is a field that could have changing options, create a
>> > > > > Status model and do a ForiegnKey(Status) on the item. If the
>> choices
>> > > > > aren't going to change frequently, the choices field could be an
>> > > > > Integer or String field and use the Django choices functionality.
>> >
>> > > > >http://www.djangoproject.com/documentation/models/choices/
>> >
>> > > > > I gather that you may not have a ton of experience working with
>> > > > > relational databases. Perhaps an article on basic database design
>> > > > > might help. It's best to really understand how a relational
>> database
>> > > > > works and should be designed before trying to work with Django's
>> ORM.
>> >
>> > > > >
>> http://www.deeptraining.com/litwin/dbdesign/FundamentalsOfRelationalD.
>> > > ..
>> >
>> > > > > On Feb 18, 3:17 pm, Timothy Kinney <timothyjkin...@gmail.com>
>> wrote:
>> > > > > > Hello, I'm new to Django, but learning as fast as I can. I would
>> > > > > > appreciate some technical help and some database design
>> advice...
>> >
>> > > > > > **
>> > > > > > 1) Admin pluralizing question
>> >
>> > > > > > So I have three models: samurai, item, inventory
>> >
>> > > > > > When I login to the admin screen it has chosen to pluralize them
>> as:
>> > > > > > samurais, items, inventorys
>> >
>> > > > > > I'm a little bit anal, so this bothers me. Where can I change it
>> to:
>> > > > > > samurai, items, inventories ?
>> >
>> > > > > > **
>> > > > > > 2) Model relationships question
>> >
>> > > > > > Can someone validate that I am using the right relations for
>> these?
>> > > > > > Users will login with a unique id and instantiate a samurai,
>> each
>> > > > > > possessing various attributes (not shown below). Items have
>> unique
>> > > IDs
>> > > > > > but many samurai can have many of the same items (including
>> > > > > > duplicates)- also the items have a status as to the condition of
>> the
>> > > > > > item. There is one inventory for each samurai which links his
>> items
>> > > to
>> > > > > > him. Based on this system, I believe I should do the
>> following...
>> >
>> > > > > > Samurai model: AutoField ID (primary key, unique)
>> > > > > > Item model: AutoField ID (primary key, unique),
>> ManyToMany(Samurai)
>> > > > > > Inventory: Foreignkey(Samurai), ManyToMany(Item)
>> >
>> > > > > > Did I do this right?
>> >
>> > > > > > **
>> >
>> > > > > > And two design questions:
>> >
>> > > > > > 3) How should I implement duplicates of items for a single
>> inventory?
>> > > > > > For example, one samurai may have two identical fish. Should I
>> store
>> > > > > > this as an additional field in the inventory? If so, how do I
>> link it
>> > > > > > to the item id? Is it cleaner/faster/better to use a dictionary?
>> > > > > > Actually, I've never heard of a dict in SQL.
>> >
>> > > > > > 4) How should I implement the status/condition of the items? For
>> > > > > > example, I want them to be "New", "Used", or "Broken/Unusable".
>> > > Should
>> > > > > > I store this in the inventory or in a separate model called
>> Status?
>> > > If
>> > > > > > the latter, should I use a foreignkey(item) and
>> OneToOne(Inventory)
>> > > or
>> > > > > > something else?
>> >
>> > > > > > Thank you very much for your help. If you are aware of any
>> tutorials
>> > > > > > or available source code for coding RPGs, browser games, or
>> > > > > > inventories, I will be happy to follow links and try to learn on
>> my
>> > > > > > own.
>> >
>> > > > > > -Tim
>> >
>> > > > > --
>> > > > > You received this message because you are subscribed to the Google
>> > > Groups
>> > > > > "Django users" group.
>> > > > > To post to this group, send email to
>> django-us...@googlegroups.com.
>> > > > > To unsubscribe from this group, send email to
>> > > > > django-users+unsubscr...@googlegroups.com<django-users%2bunsubscr...@googlegroups.com>
>> <django-users%2bunsubscr...@googlegroups.com<django-users%252bunsubscr...@googlegroups.com>
>> >
>> > > <django-users%2bunsubscr...@googlegroups.com<django-users%252bunsubscr...@googlegroups.com>
>> <django-users%252bunsubscr...@googlegroups.com<django-users%25252bunsubscr...@googlegroups.com>
>> >
>> >
>> > > > > .
>> > > > > For more options, visit this group at
>> > > > >http://groups.google.com/group/django-users?hl=en.
>> >
>> > > --
>> > > You received this message because you are subscribed to the Google
>> Groups
>> > > "Django users" group.
>> > > To post to this group, send email to django-us...@googlegroups.com.
>> > > To unsubscribe from this group, send email to
>> > > django-users+unsubscr...@googlegroups.com<django-users%2bunsubscr...@googlegroups.com>
>> <django-users%2bunsubscr...@googlegroups.com<django-users%252bunsubscr...@googlegroups.com>
>> >
>> > > .
>> > > For more options, visit this group at
>> > >http://groups.google.com/group/django-users?hl=en.
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "Django users" group.
>> To post to this group, send email to django-us...@googlegroups.com.
>> To unsubscribe from this group, send email to
>> django-users+unsubscr...@googlegroups.com<django-users%2bunsubscr...@googlegroups.com>
>> .
>> For more options, visit this group at
>> http://groups.google.com/group/django-users?hl=en.
>>
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-us...@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.

Reply via email to